主な方法
- ログインユーザーにnopasswdを指定する
- rundeckのoptionで指定して使う
2はうまく動かすの妙にハマった。
ログインユーザーにnopasswdを指定する
手順
jobユーザーにログインするものとして、/etc/sudoers
に以下の行を足す。
job ALL=(ALL) NOPASSWD: ALL
これだけだとsudo: sorry, you must have a tty to run sudo
なんてエラーが出ることがある。端末がない状態でsudoが出来ない設定がオンになっているためで、今回追加したユーザーに対してのみsudo出来るように設定してやる。
Defaults:job !requiretty
これで実行してやれば普通に動く。
気になる点
ただし、これだけだと『rundeckサーバー内に格納されている鍵情報を取ることが出来たら接続するリモートのサーバーに対して何でもできちゃう』という状態になってちょっと怖い。後述するけどKey StorageのGUIから鍵を保存すると644で保存される事象もあるので、潜在的に踏み台として使われるリスクを抱えてるシステムってあるんじゃないんだろうか。
rundeckのoptionで指定して使う
手順
- /rundeck/menu/storageから"Add or Upload a Key"でユーザーパスワードを登録する
- パーミッションを600にする
- JobのOptionsで『sudoPassword』という名前のものを作る
- Input Typeでsecureを指定して1で作ったストレージをStorage Pathに指定する
- Workflowで指定しているscriptに対して
echo @option.sudoPassword@ | sudo -S command
といった形式でsudoを実行する -
/var/rundeck/projects/{project}/etc/resources.xml
の対象サーバーにsudo-command-enabled="true"
の項目を足す※
※2.6.9-1現在ではこれをやらなくてもsudoは通るが、ログに[sudo] password for job:
なんてのが残って後味が悪い。
簡単な説明
この方法だと、rundeckサーバーの中にパスワードのファイルが格納されて、rundeckはそれを使用してスクリプト中の@option.sudoPassword@の文字列を置き換える。
サーバー上ではecho password | sudo -S ls
といったコマンドが実行されるが、ユーザーのログには残らない。rundeckサーバー内にあるパスワードが書かれた鍵を盗られなければ……
ってあれ?あんまりセキュリティ性向上してなくね?
ハマった点
- option指定したら勝手にsudoにパスワード詰めてくれるものだと信じて失敗
- echo @option.sudoPassword@ | sudo lsとやって失敗
- usageに書かれてるbashのパターンを試して$RD_SUDOPASSWDとか試して失敗する
基本: rundeckにリモートのサーバーにログインする
一応基礎中の基礎だけどそもそもリモートのサーバーにSSHで入ってジョブを実行する方法についても書いておく。
- リモートのサーバーにユーザー作って鍵作る
- まずプロジェクトを立てる
- /rundeck/menu/storageから"Add or Upload a Key"でSSH鍵を登録する
- rundeckのサーバーにログインして
/var/lib/rundeck/var/storage/content/
内の登録した鍵のパーミッションを600にする※ -
/var/rundeck/projects/{project}/etc/resources.xml
にログイン先のサーバーを登録する※ - ジョブの
Nodes
からDispatch to Nodes
を選択、Node Filter
から指定したサーバーを検索して当てる
※何故か2.6.9-1現在では644で保存される。rundeckで使ってるjschでは問題ないがセキュリティ的な面を鑑みて変更する。
※ノード例:
<
node name="db"
description="db server node"
tags=""
hostname="10.0.0.1"
osArch="amd64"
osFamily="unix"
osName="Linux"
osVersion="2.6.32-573.26.1.el6.x86_64"
username="job"
ssh-authentication="privateKey"
ssh-key-storage-path="keys/db"
/>