# Jenkinsの基本情報

{{#include ../../banners/hacktricks-training.md}}

## アクセス

### ユーザー名 + パスワード

Jenkinsにログインする最も一般的な方法は、ユーザー名とパスワードによる認証です。

### Cookie

If an **authorized cookie gets stolen**, it ca be used to access the session of the user. The cookie is usually called `JSESSIONID.*`. (A user can terminate all his sessions, but he would need to find out first that a cookie was stolen).

### SSO/Plugins

Jenkinsはプラグインを使って**サードパーティのSSOでアクセス可能に**設定できます。

### トークン

**Users can generate tokens** to give access to applications to impersonate them via CLI or REST API.

### SSH Keys

このコンポーネントはJenkins用の組み込みSSHサーバを提供します。これは[Jenkins CLI](https://www.jenkins.io/doc/book/managing/cli/)の代替インターフェースであり、任意のSSHクライアントを使ってこの方法でコマンドを実行できます。（[docs](https://plugins.jenkins.io/sshd/) より）

## 認可

In `/configureSecurity` it's possible to **configure the authorization method of Jenkins**. There are several options:

- **Anyone can do anything**: 匿名アクセスでもサーバを管理できます
- **Legacy mode**: Jenkins <1.164 と同じ動作です。**"admin" role** を持つ場合はシステムに対する**完全な管理権限**が与えられ、**それ以外のユーザ**（**anonymous** を含む）は**読み取り**権限のみになります。
- **Logged-in users can do anything**: このモードでは、ログインしているすべてのユーザーに対してJenkinsの**完全な管理権限**が与えられます。唯一完全な管理権限を持たないのは**anonymous user**で、読み取り権限のみ持ちます。
- **Matrix-based security**: テーブル形式で**誰が何をできるか**を設定できます。各**列**は**permission**を表し、各**行**は**ユーザまたはグループ/ロール**を表します。ここには認証されていないユーザを表す特殊ユーザ '**anonymous**' や、認証済みのすべてのユーザを表す '**authenticated**' も含まれます。

![](<../../images/image (149).png>)

- **Project-based Matrix Authorization Strategy:** これは "**Matrix-based security**" の**拡張**で、各プロジェクトごとに追加のACLマトリクスを**個別に定義**できるようにします。
- **Role-Based Strategy:** **ロールベースの戦略**を使って認可を定義できるようにします。ロールは `/role-strategy` で管理します。

## **Security Realm**

In `/configureSecurity` it's possible to **configure the security realm.** By default Jenkins includes support for a few different Security Realms:

- **Delegate to servlet container**: Jenkinsコントローラを実行しているサーブレットコンテナ（例：[Jetty](https://www.eclipse.org/jetty/)）に認証を委譲します。
- **Jenkins’ own user database:** 外部システムに委譲する代わりに、Jenkinsの**組み込みユーザデータストア**で認証を行います。これはデフォルトで有効です。
- **LDAP**: ユーザやグループを含め、構成されたLDAPサーバにすべての認証を委譲します。
- **Unix user/group database**: Jenkinsコントローラ上の基盤となるUnix OSレベルのユーザデータベースに認証を委譲します。このモードではUnixグループを認可に再利用することも可能です。

Plugins can provide additional security realms which may be useful for incorporating Jenkins into existing identity systems, such as:

- [Active Directory](https://plugins.jenkins.io/active-directory)
- [GitHub Authentication](https://plugins.jenkins.io/github-oauth)
- [Atlassian Crowd 2](https://plugins.jenkins.io/crowd2)

## Jenkins Nodes, Agents & Executors

Definitions from the [docs](https://www.jenkins.io/doc/book/managing/nodes/):

**Nodes** はビルド **agents が動作するマシン** です。Jenkinsは各接続ノードのディスク空き容量、一時領域の空き、スワップの空き、クロック時間/同期、応答時間を監視します。これらの値が設定閾値を超えた場合、ノードはオフラインになります。

**Agents** は **executors を使って** Jenkinsコントローラの代わりに**タスク実行を管理**します。エージェントはJavaをサポートする任意のOSを利用できます。ビルドやテストに必要なツールはエージェントが動作するノード上にインストールされます；直接インストールするか、コンテナ（DockerやKubernetes）内にインストールできます。各**agent はホスト上で独自の PID を持つプロセス**として実行されます。

**executor** は**タスク実行のスロット**であり、実質的には**エージェント内のスレッド**です。ノード上の**executorの数**は、そのノードで同時に実行できる**並列タスク数**を定義します。言い換えれば、同じノードで同時に実行できるPipelineの `stages` の**並列数**を決定します。

## Jenkins Secrets

### シークレットと認証情報の暗号化

Definition from the [docs](https://www.jenkins.io/doc/developer/security/secrets/#encryption-of-secrets-and-credentials): Jenkins uses **AES to encrypt and protect secrets**, credentials, and their respective encryption keys. These encryption keys are stored in `$JENKINS_HOME/secrets/` along with the master key used to protect said keys. This directory should be configured so that only the operating system user the Jenkins controller is running as has read and write access to this directory (i.e., a `chmod` value of `0700` or using appropriate file attributes). The **master key** (sometimes referred to as a "key encryption key" in cryptojargon) is **stored \_unencrypted**\_ on the Jenkins controller filesystem in **`$JENKINS_HOME/secrets/master.key`** which does not protect against attackers with direct access to that file. Most users and developers will use these encryption keys indirectly via either the [Secret](https://javadoc.jenkins.io/byShortName/Secret) API for encrypting generic secret data or through the credentials API. For the cryptocurious, Jenkins uses AES in cipher block chaining (CBC) mode with PKCS#5 padding and random IVs to encrypt instances of [CryptoConfidentialKey](https://javadoc.jenkins.io/byShortName/CryptoConfidentialKey) which are stored in `$JENKINS_HOME/secrets/` with a filename corresponding to their `CryptoConfidentialKey` id. Common key ids include:

- `hudson.util.Secret`: used for generic secrets;
- `com.cloudbees.plugins.credentials.SecretBytes.KEY`: used for some credentials types;
- `jenkins.model.Jenkins.crumbSalt`: used by the [CSRF protection mechanism](https://www.jenkins.io/doc/book/managing/security/#cross-site-request-forgery); and

### Credentials Access

Credentials can be **scoped to global providers** (`/credentials/`) that can be accessed by any project configured, or can be scoped to **specific projects** (`/job/<project-name>/configure`) and therefore only accessible from the specific project.

According to [**the docs**](https://www.jenkins.io/blog/2019/02/21/credentials-masking/): Credentials that are in scope are made available to the pipeline without limitation. To **prevent accidental exposure in the build log**, credentials are **masked** from regular output, so an invocation of `env` (Linux) or `set` (Windows), or programs printing their environment or parameters would **not reveal them in the build log** to users who would not otherwise have access to the credentials.

**That is why in order to exfiltrate the credentials an attacker needs to, for example, base64 them.**

### プラグイン/ジョブ設定ファイル上のシークレット

Do not assume secrets are only in `credentials.xml`. Many plugins persist secrets in their **own global XML** under `$JENKINS_HOME/*.xml` or in per-job `$JENKINS_HOME/jobs/<JOB>/config.xml`, sometimes even in plaintext (UI masking does not guarantee encrypted storage). If you gain filesystem read access, enumerate those XMLs and search for obvious secret tags.
```bash
# Global plugin configs
ls -l /var/lib/jenkins/*.xml
grep -R "password\\|token\\|SecretKey\\|credentialId" /var/lib/jenkins/*.xml

# Per-job configs
find /var/lib/jenkins/jobs -maxdepth 2 -name config.xml -print -exec grep -H "password\\|token\\|SecretKey" {} \\;
```
## 参考文献

- [https://www.jenkins.io/doc/book/security/managing-security/](https://www.jenkins.io/doc/book/security/managing-security/)
- [https://www.jenkins.io/doc/book/managing/nodes/](https://www.jenkins.io/doc/book/managing/nodes/)
- [https://www.jenkins.io/doc/developer/security/secrets/](https://www.jenkins.io/doc/developer/security/secrets/)
- [https://www.jenkins.io/blog/2019/02/21/credentials-masking/](https://www.jenkins.io/blog/2019/02/21/credentials-masking/)
- [https://www.jenkins.io/doc/book/managing/security/#cross-site-request-forgery](https://www.jenkins.io/doc/book/managing/security/#cross-site-request-forgery)
- [https://www.jenkins.io/doc/developer/security/secrets/#encryption-of-secrets-and-credentials](https://www.jenkins.io/doc/developer/security/secrets/#encryption-of-secrets-and-credentials)
- [https://www.jenkins.io/doc/book/managing/nodes/](https://www.jenkins.io/doc/book/managing/nodes/)
- [https://www.nccgroup.com/research-blog/story-of-a-hundred-vulnerable-jenkins-plugins/](https://www.nccgroup.com/research-blog/story-of-a-hundred-vulnerable-jenkins-plugins/)

{{#include ../../banners/hacktricks-training.md}}
