川獺の外部記憶

なんでも残しておく闇鍋みたいな備忘録

Jenkinsの設定からメール設定情報を引き抜く

Jenkinsサーバの中からメール設定(SMTP設定)を引き抜く手法について、実験してみたことのメモです。

注意:
本手順は管理権限を濫用した行為とみなされる場合があります。また、認証情報に個人情報が含まれる場合、濫用とみなされるか否かに関わらず、本手順を適用しないようにして下さい。(システム管理権限者としての最低限の責務です。)

本題

前提

環境はWindows10です。Jenkinsは最新版を使いました。

環境変数JENKINS_HOMEを確認する

  1. {JenkinsのURL}/systemInfo にブラウザでアクセスします。
  2. JENKINS_HOME 環境変数を確認します。(ページ内検索して下さい) f:id:marineotter:20200604213633p:plain

設定を抜き出す

  1. コマンドプロンプトを管理者権限で立ち上げます。
    (スタートメニューで cmd と打ち、Ctrl + Shift + Enterを入力します。(エクスプローラではCtrl+Shiftを入力しながらのEnterは管理者権限での実行になります。))
  2. 先程抜き出した JENKINS_HOME にcdします。
  3. hudson.plugins.emailext.ExtendedEmailPublisher.xml をエディタで開きます。*1
    • notepad hudson.plugins.emailext.ExtendedEmailPublisher.xml
    • code hudson.plugins.emailext.ExtendedEmailPublisher.xml
  4. <mailAccount></mailAccount> で挟まれた部分をメモします。

smtpPasswordを復号する

この手順は、上記mailAccountが個人情報を含んでいないと確信できるときにのみ適用して下さい。 個人情報を含んでいる可能性がある場合は諦めて下さい。

smtpPasswordはJenkinsのSecretクラス(以下参照)により暗号化されています。
jenkins/Secret.java at master · jenkinsci/jenkins · GitHub

これを復号するために、Jenkinsのscript consoleを使用します。

  1. {JenkinsのURL}/script にアクセスします。
  2. println(hudson.util.Secret.decrypt("暗号化されたsmtpPassword")); を入力し、[実行] をクリックします。
  3. 「結果」部分に復号されたパスワードが出力されます。 f:id:marineotter:20200604212701p:plain

手順は以上ですが、下記に余談を続けます。

余談

管理権限者としての責務

Linuxディストリビューションでよく使われる sudo コマンドでは、初回のsudo時に下記のような教訓(?)が表示されます。

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.
  1. 他人のプライバシーを尊重するように。
  2. 操作を打つ前に考えるように。
  3. 大きな力には大きな責任が伴う。

管理権限を行使する場合には常に頭の片隅においておくべきだと思います。 よく半寝で環境全壊させてるので説得力無いですが。私にsudoコマンドを打たせるべきではない。

Jenkinsの暗号化、復号化から読み取れる思想

一般的にサーバでの個人情報保管については大前提が3つあります。

  1. 必要なければ保管しない。(クレジットカード情報など、本当にやばい情報は責任取れないなら毎回入力させる。)*2
  2. どうしても保管する場合、復号が不要な場合にはハッシュ化などにより復号不可能な(非可逆な)暗号化を行う。
  3. どうしても復号が必要な情報を保管する場合、鍵と暗号化情報は一度に漏洩しにくい場所に保管する。

よくある「『パスワードを忘れました』ボタンを押したら生のパスワードがメールで送られてきました」なんていうのは2の観点から論外ですね。

Jenkinsのメールパスワードは3. の「どうしても復号が必要な情報」にあたります。

これの復号に必要な鍵は、設定ファイルと同じディレクトリの secret ディレクトリに保管されているものだと思います。*3 なので設定ファイルのディレクトリが漏洩した場合、暗号化してあっても簡単に情報が漏洩してしまいそうです。*4

管理者的思想から見ればこれはあながち悪いものではなく、設定ファイルのディレクトリをバックアップしておけば、環境が壊れても暗号化情報を失うことはないというメリットはあります。ただ、これなら暗号化しなくてもいいのでは…とも思ってしまいますね。

おそらく可用性をなるべく維持した結果がこうなっているので、セキュリティは本当に難しいと思います。

以上。

*1:私の環境では ExtendedEmailPublisher.xml でしたが、使い方によって違うところに残っているかもしれません。

*2:諸々のセキュリティインシデントを見ていると、情報漏えいの原因は経路盗聴より保管場所へのクラッキングのほうが圧倒的多数です。保管さえしなければある程度は安心できる。

*3:力尽きてソースを読み切れていません。

*4:ソース読みきれてないので断定できません