コマンドラインからJenkinsセキュリティ設定をリセット/無効にする
1. 概要
Jenkins は、部分的および完全なソフトウェア開発サイクルを自動化するためのオープンソースの自動化サーバーです。 継続的インテグレーションと継続的デリバリーを容易にします。
Jenkinsを使用すると、さまざまなユーザーにさまざまなレベルのセキュリティを提供できます。 デフォルトでは、すべてのユーザーにフルアクセスを提供する必要はありません。 Jenkinsのセキュリティは、Jenkinsコンソール(UI)およびコマンドラインから表示、リセット、または完全に無効にすることができます。 コマンドラインを使用して、Jenkinsの構成を変更する必要があります。
先に進む前に、まず問題を理解しましょう。 Jenkinsのログイン資格情報を忘れてしまうことがあります。 その結果、ジェンキンスにアクセスできなくなります。
このチュートリアルでは、コマンドラインを使用してJenkinsコンソールへのアクセスを回復するさまざまな方法について説明します。 紛失したパスワードをリセットする方法、セキュリティを無効にする方法、およびその他の代替方法について学習します。
JenkinsマシンへのSSHアクセスがあると想定されています。 これから説明する各ソリューションでは、Jenkinsサーバーを再起動する必要があります。したがって、マシンで実行されているジョブがないことを確認してください。
2. Jenkinsのメイン構成ファイルを更新する
Jenkinsコンソールにアクセスできないため、コマンドラインを使用してJenkins構成を更新します。
2.1. メイン設定ファイルを探す
一般に、Linuxマシンには、パッケージマネージャーまたはWARファイルを使用する2つの方法でJenkinsをインストールできます。 パッケージマネージャーサーバーを使用してJenkinsをインストールする場合、config.xmlファイルへのパスは/var/lib/jenkins/config.xmlになります。 一方、 JenkinsのインストールがWARファイルを使用して行われた場合、 config.xmlファイルは
config.xml ファイルが上記のいずれのパスにも存在しない場合は、findコマンドを使用してマシン全体を検索できます。
$ find / -name config.xml
2.2. Jenkinsセキュリティを無効にする
config.xml ファイルを見つけたら、次のセキュリティ属性をtrueからfalseに更新しましょう。
<useSecurity>false</useSecurity>
エディターにアクセスできない場合は、sedコマンドを使用してconfig.xmlファイルを更新しましょう。
$ sed -i 's/<useSecurity>true<\/useSecurity>/<useSecurity>false<\/useSecurity>/g' /var/lib/jenkins/config.xml
2.3. Jenkinsを再起動します
最後に、Jenkinsを再起動して、変更を有効にします。 Jenkinsがパッケージマネージャーを使用してインストールされている場合は、次のコマンドを使用します。
$ systemctl restart jenkins
JenkinsがWARを使用してインストールされている場合は、最初にJavaプロセスを停止してから、 java-jarコマンドを使用してJenkinsを再起動する必要があります。
これで、Jenkinsコンソールにアクセスするときに、パスワードを要求されなくなりました。 このソリューションは単純ですが、セキュリティを完全にバイパスするため、お勧めしません。
3. Jenkinsユーザー構成ファイルを更新する
次に、Jenkinsユーザーの構成ファイルのパスワードをリセットするより良いソリューションを調べてみましょう。 Jenkins作業ディレクトリ内に存在するファイルを更新するための十分な権限があることを確認しましょう。
3.1. ユーザー構成ファイルの検索
先に進む前に、Jenkinsディレクトリ構造について詳しく見ていきましょう。 Jenkinsは、 users ディレクトリを作成して、すべてのユーザーアカウントの詳細を保存します。 このディレクトリは、Jenkinsの作業ディレクトリ内にあります。 次のファイルパスに、各Jenkinsユーザーに対応するconfig.xmlファイルがあります。
<Jenkins_Working_Directory>/users/<Jenkins_User_Folder>/config.xml
ここで、 Jenkins_Working_Directory は、すべてのログ、構成、およびビルドアーティファクトを格納するディレクトリです。 Jenkins作業ディレクトリのデフォルトパスは次のとおりです。
$ cd /var/lib/jenkins/users/
$ ls
user1_4268539434599263174 user2_948489902389144094 user3_162302090988132370 users.xml
$ cd user1_4268539434599263174/
$ ls
config.xml
3.2. BCryptハッシュを生成する
先ほど発見したユーザー構成ファイルには、パスワードハッシュを含む多くのユーザーレベルの構成が含まれています。 Jenkinsは、 bcrypt ハッシュアルゴリズムを使用して、パスワードのハッシュを生成します。 bcryptアルゴリズムは、最終的なハッシュを返す前に反復回数を決定するソルトラウンドを使用します。 したがって、多層で保護されます。
簡単に言うと、新しいパスワードを選択し、そのハッシュを生成して、config.xmlファイルのハッシュを置き換えます。 このようにして、パスワードは正常にリセットされます。 パスワードを暗号化してハッシュを生成するには、この公開されているツールを使用します。
rootユーザーのパスワードを紛失した場合を考えてみましょう。 新しいパスワードを次のように更新することにしました。
同じパスワードに対して、パスワードを暗号化するたびに異なるハッシュが生成されることに注意してください。この動作は、bcryptアルゴリズムがいかに強力であるかを証明しています。
3.3. 構成ファイルの更新
ここで、ユーザーconfig.xmlファイルのpasswordHashを置き換えましょう。
<passwordHash>#jbcrypt:$2a$10$a7XcruSVvyb0.6ckv97/hOqqTuVx.qzuf7oq9He6HG7puq8DzYwFq</passwordHash>
ここで、jBCryptはbcryptのJava実装を示します。 最後に、変更を有効にするためにJenkinsサーバーを再起動する必要があります。 パスワードがシークレットにリセットされました。
このアプローチは、他のJenkinsユーザーのセキュリティに影響を与えないため、以前のアプローチよりも優れています。
4. 別のユーザーを使用する
adminユーザーのパスワードを失ったので、root権限を持つ新しいユーザーを作成しましょう。 この新しいユーザーを使用して、Jenkinsコンソールから古いユーザーのパスワードをリセットします。
最後に、作成したすべての構成と新しいユーザーをクリーンアップします。
4.1. サインアップを有効にする
デフォルトでは、Jenkinsは初期インストール時にサインアップオプションを提供します。 メインのconfig.xml( /var/lib/jenkins/config.xml または〜/で disableSignup 属性を設定して、これを有効にしましょう。 jenkins / config.xml )ファイルを false に:
<disableSignup>false</disableSignup>
4.2. 新しいrootユーザーを作成する
Jenkinsサーバーを再起動して、Jenkinsコンソールにアクセスしてみましょう。 今回は、Jenkinsのログインページに新しいアカウントを作成するためのリンクがあります。
まず、Jenkinsコンソールから新しいユーザー( myuser )にサインアップしましょう。 次に、メインの config.xml ファイルを更新して、このユーザーに管理者権限を付与します。
<roleMap type="globalRoles">
<role name="admin" pattern=".*">
<permissions>
...
</permissions>
<assignedSIDs>
<sid>myuser</sid>
</assignedSIDs>
</role>
<roleMap/>
ここでは、AssignedSIDsタグ内のsidタグの周りに新しく作成されたユーザーを追加しました。 次に、Jenkinsサーバーを再起動します。
4.3. パスワードを更新する
新しいユーザー( myuser )でログインし、Jenkinsの管理>ユーザーの管理に移動しましょう。 次に、パスワードを更新するユーザー(root)を選択し、パスワードを更新します。
変更を保存して適用しましょう。 これにより、以前に失ったユーザーのパスワードが正常に更新されます。
4.4. 掃除
パスワードを回復したら、すべてをクリーンアップしましょう。 まず、新しく作成したユーザーmyuserを削除します。 これを行うには、パスワードを回復したばかりのadminユーザーでログインします。 次に、Jenkinsの管理>[ユーザーの管理]に移動し、前に作成したユーザーを削除します。
次に、config.xmlファイルのassignedSIDsタグからユーザーエントリを削除する必要があります。 最後に、 disableSignupフラグをtrueに戻し、サインアップ機能を無効にします。
このソリューションは、ジェンキンスのセキュリティに害を及ぼすことはありません。 ロールベースの承認戦略プラグインを使用したロールベースのメカニズムを使用してユーザーを管理する場合に役立ちます。
5. 構成を削除します
何らかの理由で上記の方法のいずれも機能しない場合は、構成属性/ファイルを削除できます。 すべてのJenkinsユーザーのセキュリティが無効になります。 したがって、これは仕事を成し遂げるための推奨される方法ではありません。
5.1. 構成属性の削除
useSecurityおよびauthorizationStrategyセキュリティ属性をconfig.xmlから削除して、Jenkinsのセキュリティ設定を無効にすることができます。
$ sudo ex +g/useSecurity/d +g/authorizationStrategy/d -scwq /var/lib/jenkins/config.xml
Jenkinsサーバーを再起動しましょう。 Jenkinsにアクセスできるようになったら、Jenkinsコンソールの「グローバル・セキュリティーの構成」ページからセキュリティーを再度有効にすることができます。
5.2. 構成ファイルを削除する
Jenkins config.xml ファイルを削除して、セキュリティを無効にすることもできます。
$ rm -f /var/lib/jenkins/config.xml
以前に行われたすべての構成変更は破棄され、デフォルトの構成ファイルがロードされることに注意してください。
繰り返しますが、変更を有効にするには、Jenkinsサーバーを再起動する必要があります。
6. 結論
この記事では、パスワードを失った後、Jenkinsコンソールへのアクセスを回復するためのさまざまなアプローチを実行しました。
まず、セキュリティを完全に無効にする方法を検討しました。 これは他のユーザーにも影響します。 したがって、お勧めしません。
さらに、Jenkins config.xml ファイルのハッシュを上書きし、別の管理者ユーザーを作成して、パスワードをリセットします。 これは、ジェンキンスの他の側面を妨げることなく問題を解決するための完璧な方法です。
最後に、Jenkins構成のセキュリティ関連のプロパティとファイルを削除して、セキュリティを無効にしました。