Jenkins移行時のつまづきポイント、Credentials
Jenkinsを別サーバーに移行する際、一番忘れがちなのがCredentials。
再発行した方が早いかもしれないが、外部サービスと連携したAPIキーなどは再発行が面倒だったり、使いまわしている場合に他サービスに影響が出る場合もある。(そもそも使い回すのがどうかという議論はさておく)
っていうか、移行前サーバーにあるデータなのにサービス元まで確認に行くのが面倒くさい
Credentialsは復元できない?
ふつうにJenkinsからCredentialsの内容を見に行くと、隠しテキスト化されてしまっていて閲覧ができない。
SSHから /var/lib/jenkins/credentials.xml
を確認に行っても {AQAAA...../.......}
のような暗号化された値しか閲覧できない。
(ちなみに、ブラウザで表示したCredentialsの更新画面のソースからもこれは取得できる)
<java.util.concurrent.CopyOnWriteArrayList>
<org.jenkinsci.plugins.plaincredentials.impl.StringCredentialsImpl plugin="plain-credentials">
<scope>GLOBAL</scope>
<id>HOGE-SECRET</id>
<description>ほげほげ</description>
<secret>{AQAAABAAAAAQ38QQY5Zxk6OzKUz7u5KZh+xa+W2WlKR/iQ254IxBREg=}</secret>
</org.jenkinsci.plugins.plaincredentials.impl.StringCredentialsImpl>
</java.util.concurrent.CopyOnWriteArrayList>
パスワードのところで「要素を検証」するとすぐ上くらいに表示される。
Jenkinsで暗号化しているならJenkinsの機能で復元できるんじゃないか? ・・・ できた!
調べたらありました。
Jenkinsの管理 → スクリプトコンソールより以下を実行
println hudson.util.Secret.decrypt("{AQAAABAAAAAQ38QQY5Zxk6OzKUz7u5KZh+xa+W2WlKR/iQ254IxBREg=}")
注意
暗号化キーがサーバーによって違うので、上記のコマンドを暗号化データを含めてコピーしただけだと結果は出ないので、各々差し替える必要がある。
(同様にcredentials.xmlの内容をサーバーを跨いでコピーしても動作しない)
Jenkinsの管理権限があれば誰でもCredentialsは閲覧できてしまう
まぁ、「管理者」なんだから当然と言えば当然だけど・・・
ユーザーの権限管理は気をつけよう。
参考資料(というか該当部分を抜粋しただけ)
- Accessing and dumping Jenkins credentials
https://www.codurance.com/publications/2019/05/30/accessing-and-dumping-jenkins-credentials