Basic Jenkins Information
アクセス
ユーザー名 + パスワード
Jenkinsにログインする最も一般的な方法は、ユーザー名またはパスワードを使用することです。
Cookie
認証済みのCookieが盗まれた場合、そのCookieを使用してユーザーのセッションにアクセスできます。Cookieは通常JSESSIONID.*
と呼ばれます。(ユーザーはすべてのセッションを終了できますが、最初にCookieが盗まれたことを見つける必要があります)。
SSO/プラグイン
Jenkinsは、サードパーティSSOを介してアクセス可能にするためにプラグインを使用して構成できます。
トークン
ユーザーはトークンを生成して、CLIやREST APIを介してアプリケーションに自分を偽装させるためのアクセスを与えることができます。
SSHキー
このコンポーネントは、Jenkins用の組み込みSSHサーバーを提供します。これはJenkins CLIの代替インターフェースであり、SSHクライアントを使用してこの方法でコマンドを呼び出すことができます。(ドキュメントより)
認可
/configureSecurity
でJenkinsの認可方法を構成することができます。いくつかのオプションがあります:
誰でも何でもできる:匿名アクセスでもサーバーを管理できます
レガシーモード:Jenkins <1.164と同じ。"admin"ロールがある場合、システム全体を完全に制御できます。それ以外の場合(匿名ユーザーを含む)、読み取りアクセスしかありません。
ログインユーザーは何でもできる:このモードでは、ログインユーザー全員がJenkinsを完全に制御できます。唯一のユーザーである匿名ユーザーは、読み取りアクセスのみを取得します。
Matrix-based security:表で誰が何を行うかを構成できます。各列は権限を表し、各行はユーザーまたはグループ/ロールを表します。これには、未認証ユーザーを表す特別なユーザー 'anonymous' と、すべての認証済みユーザーを表す 'authenticated' が含まれます。
Project-based Matrix Authorization Strategy: このモードは、各プロジェクトに対して追加のACLマトリックスを個別に定義できる "Matrix-based security" の拡張です。
Role-Based Strategy: 役割ベースの戦略を使用して認可を定義できるようにします。
/role-strategy
で役割を管理します。
セキュリティレルム
/configureSecurity
でセキュリティレルムを構成することができます。デフォルトでは、Jenkinsにはいくつかの異なるセキュリティレルムのサポートが含まれています:
サーブレットコンテナに委任:Jenkinsコントローラーを実行しているサーブレットコンテナ(Jettyなど)に認証を委任するためのもの。
Jenkins独自のユーザーデータベース:外部システムに委任する代わりに、認証にJenkins独自の組み込みユーザーデータストアを使用します。これはデフォルトで有効です。
LDAP:ユーザーとグループの両方を含む構成済みのLDAPサーバーにすべての認証を委任します。
Unixユーザー/グループデータベース:Jenkinsコントローラーの基礎となるUnix OSレベルのユーザーデータベースに認証を委任します。このモードでは、Unixグループを認可に再利用できます。
プラグインは、Jenkinsを既存のアイデンティティシステムに組み込むのに役立つ追加のセキュリティレルムを提供できます:
Jenkinsノード、エージェント&実行エージェント
ドキュメントからの定義:
ノードはビルドエージェントが実行されるマシンです。Jenkinsは、各接続されたノードをディスクスペース、空き一時スペース、空きスワップ、クロック時間/同期、応答時間について監視します。これらの値のいずれかが構成されたしきい値を超えると、ノードはオフラインになります。
エージェントは、エグゼクターを使用してJenkinsコントローラーの代理でタスクの実行を管理します。エージェントはJavaをサポートする任意のオペレーティングシステムを使用できます。ビルドやテストに必要なツールは、エージェントが実行されるノードにインストールされます。これらは直接インストールするか、コンテナ(DockerまたはKubernetes)にインストールできます。各エージェントは、ホストマシン上で独自のPIDを持つプロセスです。
エグゼクターは、タスクの実行のためのスロットであり、実質的にはエージェント内のスレッドです。ノード上のエグゼクターの数は、そのノードで同時に実行できる並行タスクの数を定義します。言い換えれば、これはそのノードで同時に実行できる並行Pipeline ステージ
の数を決定します。
Jenkinsの秘密
秘密と資格情報の暗号化
ドキュメントからの定義:Jenkinsは、秘密、資格情報、およびそれらの暗号化キーを暗号化および保護するためにAESを使用します。これらの暗号化キーは、それらを保護するために使用されるマスターキーとともに$JENKINS_HOME/secrets/
に保存されます。このディレクトリは、Jenkinsコントローラーが実行されているオペレーティングシステムユーザーだけがこのディレクトリに読み取りおよび書き込みアクセス権を持つように構成する必要があります(つまり、chmod
値が0700
であるか、適切なファイル属性を使用します)。マスターキー(暗号ジャーゴンでは「キー暗号化キー」とも呼ばれる)は、Jenkinsコントローラーファイルシステム上の**$JENKINS_HOME/secrets/master.key
に暗号化されていない状態で**保存されており、そのファイルに直接アクセスできる攻撃者に対しては保護されません。ほとんどのユーザーと開発者は、これらの暗号化キーを間接的に使用し、一般的な秘密データを暗号化するためのSecret APIまたは資格情報APIを介して使用します。暗号に興味がある方のために、Jenkinsは、ランダムIVを使用してAESを暗号化モードで使用し、PKCS#5パディングとCBCモードでAESを使用して、CryptoConfidentialKey
のインスタンスを暗号化するために使用されるCryptoConfidentialKeyが$JENKINS_HOME/secrets/
に保存され、そのCryptoConfidentialKey
IDに対応するファイル名が付けられます。一般的なキーIDには次のものがあります:
hudson.util.Secret
:一般的な秘密に使用されます。com.cloudbees.plugins.credentials.SecretBytes.KEY
:一部の資格情報タイプに使用されます。jenkins.model.Jenkins.crumbSalt
:CSRF保護メカニズムで使用されます。
資格情報アクセス
資格情報は、グローバルプロバイダ (/credentials/
) にスコープを設定して、構成された任意のプロジェクトからアクセスできるようにするか、特定のプロジェクト (/job/<project-name>/configure
) にスコープを設定して、その特定のプロジェクトからのみアクセスできるようにすることができます。
ドキュメントによると、スコープ内の資格情報は制限なくパイプラインで利用可能になります。ビルドログでの誤公開を防ぐために、資格情報は通常の出力からマスクされ、したがって、env
(Linux) や set
(Windows) の呼び出し、または環境やパラメータを出力するプログラムによって、それらがビルドログでユーザーに公開されることはありません。
そのため、攻撃者が資格情報を外部に持ち出すためには、例えば、それらをbase64でエンコードする必要があります。
参考文献
最終更新