Tech Sketch Bucket of Technical Chips by TIS Inc.

パスワード認証無しでSSH接続とsudoとsuを実行する方法

Pocket

Chef/Ansible/Puppet/Itamaeなどのサーバ構築自動化ツールや、ServerSpec/Infratasterなどのインフラテスト自動化ツールの使用することが多くなっている。

これらのツールを使用する為に管理サーバから各ノードに対して制御を行う際に、パスワード入力無しでのSSH接続を行う必要が発生する。さらにインストールやサーバ内の設定作業を実施する為、root権限でコマンドを実行するsudoコマンドやsuコマンドをパスワード認証無しで実行できる必要が発生する。

サーバ構築自動化、テスト自動化ツールを使う上での前提となる「パスワード認証無しでSSH接続とsudoとsuを実行する方法」について、以下にまとめてみた。

検証にはいつもの以下の環境を使用する。


今回は以下の機能を実現する。
1. 管理サーバ側からノード側へのSSH接続に鍵認証を使用することでパスワード入力を不要とする。
2. ノード側でログインした後、sudoでのコマンド実行の際にパスワード入力を求められないようにする。
3. ノード側でログインした後、su root -cでのコマンド実行の際にパスワード入力を求められないようにする。

そのための設定手順は以下となる。

ノード側の作業

1.作業用ユーザを作成
ノードにrootアカウントでログインし、作業用のユーザアカウント(maintain)を作成する。
後続の手順でパスワード認証は無効化するが、パスワード認証も残す場合は、アカウント名をランダムな英数字の組み合わせ(例えば、"dfqd56mg9srexq3k"のような)でアカウントを作成すると、Brute Force攻撃を突破されにくくなる。
# adduser -m maintain
# passwd maintain

2.作業用ユーザにパスワード認証不要のsudo権限を付与
sudo権限の設定ファイルを編集する。
以下のように記述することで、全てのコマンドをパスワード認証無しで実行できるようになる。
後述するsu root -cもパスワードを不要にする場合、wheelのNOPASSWDも有効にする。
# visudo

3.作業用ユーザをwheelグループに追加
作業用ユーザをroot権限へ昇格可能なwheelグループの登録する。
#vi /etc/group

4.wheelグループのsu時のパスワード入力を不要に設定
#vi /etc/pam.d/su

5.鍵認証のidファイル(id_rsa.pem)と認証鍵ファイル(authorized_keys.pub)を作成
作業は作業用ユーザで実施する為、suコマンドでユーザを切り替える。
# su - maintain
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ cd ~/.ssh
$ ssh-keygen -t rsa -b 4096 -f authorized_keys
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
$ mv authorized_keys.pub id_rsa.pem
$ chmod 400 authorized_keys id_rsa.pem

6.鍵認証のidファイル(id_rsa.pem)をテキストに保存して削除
$ cat ~/.ssh/id_rsa.pem
これを外部のテキストエディタ等で保存しておく。保存ができたら削除する。
rm -i ~/.ssh/id_rsa.pem

7.sshdの設定ファイルを編集
/etc/ssh/sshd_configを編集して鍵認証を有効化する。

$ sudo vi /etc/ssh/sshd_config

主な変更箇所は以下となる。

パラメータ 設定値 説明
PermitRootLogin no リモートからのrootログインの無効化
RSAAuthentication yes 鍵認証のRSA暗号の有効化
PubkeyAuthentication yes 鍵認証の有効化
AuthorizedKeysFile .ssh/authorized_keys 鍵認証ファイルの指定
PasswordAuthentication no パスワード認証を無効化

だだし、この時点では、パスワード認証は無効化していない。

8.sshdのサービスを再起動
$ sudo systemctl restart sshd

ノード側からは確認完了まで、ログアウトせずに接続テスト完了までターミナルを保持する。

管理サーバ側の作業

1.作業用ユーザを作成
管理サーバにrootアカウントでログインし、作業用のユーザアカウント(maintain)を作成する。
# adduser -m maintain# passwd maintain

2.鍵認証のidファイル(id_rsa.pem)を作成
作業は作業用ユーザで実施する為、suコマンドでユーザを切り替える。
鍵認証のidファイル(id_rsa.pem)には、ノード側の工程4で保存した情報を使用する。
# su - maintain
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ cd ~/.ssh
$ vi id_rsa.pem
$ chmod 400 id_rsa.pem

3.ノード側(tissvv096)への接続試験を実施
パスワードの代わりに '-i' オプションで鍵認証のidファイルを使用する。
$ssh maintain@tissvv096 -i ~/.ssh/id_rsa.pem
Last login: Thu May 26 10:38:53 2016 from tissvv097
[maintain@tissvv096 ~]$

これでパスワード入力を求められずにログインが行えれば成功である。

4.ログイン後にsudoコマンドの実行も確認
iptablesコマンドはroot権限でないと実行できない。パスワード入力無しで実行できれば正常に設定できている。
$sudo iptables -L

5.ログイン後にsu root -cコマンドの実行も確認
実行ユーザがrootになっていれば成功。sudoでは権限はrootだが、実行ユーザや使用される環境変数は元のユーザのままである。
$su root -c whoami

6.ユーザID、鍵認証ファイルの指定を不要にする。
ssh用のconfigファイルを作成することで、対象サーバへのユーザID、鍵ファイルの指定が不要となる。
$ vi ~/.ssh/config

7.ユーザID、鍵ファイル指定無しでログイン
ssh ホスト名だけでログインが行えることを確認する。
$ ssh tissvv096
Last login: Thu May 26 10:38:53 2016 from tissvv097
[maintain@tissvv096 ~]$

ノード側の作業(パスワード認証を無効化する場合のみ)

1.sshdの設定ファイルを編集
/etc/ssh/sshd_configを編集してパスワード認証を無効化する。

$ sudo vi /etc/ssh/sshd_config

変更箇所は以下となる。

パラメータ 設定値 説明
PasswordAuthentication no パスワード認証を無効化

2.sshdのサービスを再起動
$ sudo systemctl
restart sshd

3.作業用ユーザでログインが行えることを確認
$ ssh tissvv096
Last login: Thu May 26 14:08:08 2016 from tissvv097
[maintain@tissvv096 ~]$

4.管理サーバ側からrootおよび作業用ユーザ以外でログインが行えないことを確認
$ ssh 10.255.202.96 -l root
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
$ ssh 10.255.202.96 -l testuser
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

これで作業が完了である。だだし、本作業は失敗するとssh接続が不能となるリスクも存在する。
パブリッククラウド上のサーバの場合、コンソールが利用出来ないため、文鎮化してしまうこととなる。
パスワード認証は残しておくか、作業用のターミナルを1個、切らずに置いておくことをお勧めする。

エンジニア採用中!私たちと一緒に働いてみませんか?