Basic Jenkins Information
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
アクセス
ユーザー名 + パスワード
Jenkinsにログインする最も一般的な方法は、ユーザー名またはパスワードを使用することです。
クッキー
認証済みのクッキーが盗まれた場合、そのクッキーを使用してユーザーのセッションにアクセスすることができます。クッキーは通常 JSESSIONID.*
と呼ばれます。(ユーザーはすべてのセッションを終了することができますが、まずクッキーが盗まれたことを知る必要があります)。
SSO/プラグイン
Jenkinsはプラグインを使用してサードパーティのSSOを介してアクセス可能に構成することができます。
トークン
ユーザーはトークンを生成して、CLIやREST APIを介してアプリケーションに自分を偽装させることができます。
SSHキー
このコンポーネントは、Jenkins用の組み込みSSHサーバーを提供します。これはJenkins CLIの代替インターフェースであり、任意のSSHクライアントを使用してコマンドを呼び出すことができます。(ドキュメントより)
認可
/configureSecurity
では、Jenkinsの認可方法を構成することができます。いくつかのオプションがあります:
誰でも何でもできる:匿名アクセスでもサーバーを管理できます。
レガシーモード:Jenkins <1.164と同じです。"admin"ロールを持っている場合、システムに対する完全な制御が与えられ、それ以外の場合(匿名ユーザーを含む)は読み取りアクセスのみが与えられます。
ログインユーザーは何でもできる:このモードでは、ログインしているすべてのユーザーがJenkinsの完全な制御を持ちます。唯一完全な制御を持たないのは匿名ユーザーで、読み取りアクセスのみが与えられます。
マトリックスベースのセキュリティ:テーブルで誰が何をできるかを構成できます。各列は権限を表し、各行はユーザーまたはグループ/ロールを表します。これには、匿名ユーザーを表す特別なユーザー 'anonymous' と、認証済みユーザーを表す 'authenticated' が含まれます。
プロジェクトベースのマトリックス認可戦略:このモードは、各プロジェクトごとに追加のACLマトリックスを個別に定義できる "マトリックスベースのセキュリティ" の拡張です。
ロールベースの戦略:ロールベースの戦略を使用して認可を定義できるようにします。
/role-strategy
でロールを管理します。
セキュリティ領域
/configureSecurity
では、セキュリティ領域を構成することができます。デフォルトでJenkinsはいくつかの異なるセキュリティ領域をサポートしています:
サーブレットコンテナに委任:Jenkinsコントローラーを実行しているサーブレットコンテナ(Jettyなど)に認証を委任します。
Jenkins独自のユーザーデータベース:外部システムに委任する代わりに、Jenkinsの組み込みユーザーデータストアを使用して認証を行います。これはデフォルトで有効です。
LDAP:設定されたLDAPサーバーにすべての認証を委任し、ユーザーとグループの両方を含みます。
Unixユーザー/グループデータベース:Jenkinsコントローラー上の基盤となるUnix OSレベルのユーザーデータベースに認証を委任します。このモードでは、認可のためにUnixグループを再利用することもできます。
プラグインは、既存のアイデンティティシステムにJenkinsを組み込むために役立つ追加のセキュリティ領域を提供することができます。例えば:
Jenkinsノード、エージェント、およびエグゼキュータ
ドキュメントからの定義:
ノードは、ビルドエージェントが実行されるマシンです。Jenkinsは、ディスクスペース、空きテンポラリスペース、空きスワップ、クロック時間/同期、および応答時間を監視します。これらの値が設定されたしきい値を超えると、ノードはオフラインになります。
エージェントは、エグゼキュータを使用してJenkinsコントローラーのタスク実行を管理します。エージェントはJavaをサポートする任意のオペレーティングシステムを使用できます。ビルドおよびテストに必要なツールは、エージェントが実行されるノードにインストールされます。これらは直接インストールするか、コンテナ(DockerまたはKubernetes)にインストールすることができます。各エージェントはホストマシン上の独自のPIDを持つプロセスです。
エグゼキュータはタスクの実行スロットであり、実質的にはエージェント内のスレッドです。ノード上のエグゼキュータの数は、そのノードで一度に実行できる同時タスクの数を定義します。言い換えれば、これはそのノードで一度に実行できる同時パイプラインステージ
の数を決定します。
Jenkinsシークレット
シークレットと資格情報の暗号化
ドキュメントからの定義:JenkinsはAESを使用してシークレット、資格情報、およびそれらの暗号化キーを保護します。これらの暗号化キーは、マスターキーと共に $JENKINS_HOME/secrets/
に保存されます。このディレクトリは、Jenkinsコントローラーが実行されているオペレーティングシステムユーザーのみが読み取りおよび書き込みアクセスを持つように構成する必要があります(つまり、chmod
値を0700
に設定するか、適切なファイル属性を使用します)。マスターキー(暗号用語で「キー暗号化キー」と呼ばれることもあります)は、$JENKINS_HOME/secrets/master.key
に暗号化されずにJenkinsコントローラーのファイルシステムに保存されており、そのファイルに直接アクセスできる攻撃者に対して保護されていません。ほとんどのユーザーおよび開発者は、Secret APIを介して一般的なシークレットデータを暗号化するか、資格情報APIを介してこれらの暗号化キーを間接的に使用します。暗号に興味がある方のために、JenkinsはPKCS#5パディングとランダムIVを使用してAESを暗号ブロック連鎖(CBC)モードで使用し、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エンコードする必要があります。
参考文献
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Last updated