2018年7月7日土曜日

sshd_config の AuthorizedKeysCommand を設定して IAMユーザのSSH公開キーでログインする


下記の記事を見て、ssh の AuthorizedKeysCommand を知りました。
AuthorizedKeysCommand にコマンドを指定すると、コマンドの実行結果として公開鍵を渡すことができるらしい。
OpenSSH 6.2を使って公開鍵認証もLDAPで行いたい。

そこで、AWSのIAMユーザにSSH公開鍵を登録して、その鍵で、SSHログインできるか試してみました。

1.IAMユーザにssh公開鍵を登録


まず、キーペアを作成します
[root@centos701 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:yU9NjtIMq8a9LJhNboxtZ2gxcEcLQTFNROj3ETvlMBU root@centos701
The key's randomart image is:
+---[RSA 2048]----+
|     .=O+  .E.   |
|      o.o + .    |
|     . o.. B.    |
|    . o.+*+=.    |
|     o oS.=oo    |
|     .+o +.      |
|     X++. .      |
|    +.@.o.       |
|     + +o        |
+----[SHA256]-----+

~/.ssh に公開鍵(id_rsa.pub)と秘密鍵(id_rsa)ができます。
[root@centos701 ~]# ls ~/.ssh/id*
/root/.ssh/id_rsa  /root/.ssh/id_rsa.pub

AWSコンソールでIAMユーザに上記で作成した公開鍵を登録します。
今回使用するIAMユーザは user01 です。
IAMユーザの[認証情報]タブで、[SSH公開キーのアップロード]ボタンをクリックします。
下図のように、作成した公開鍵をコピー&ペーストして、[SSH公開キーのアップロード]ボタンをクリックします。


下図のようにSSH公開鍵が登録されます。


2.SSH公開鍵取得スクリプトの用意


IAMユーザのSSH公開鍵を取得するスクリプトを用意します。
AuthorizedKeysCommand に設定して、sshd から実行されると、引数にユーザが渡されます。
スクリプト名は、/usr/local/sbin/aws_ssh_key.sh とし、内容は以下のようにしました。
テスト環境が、VirtualBoxなのでアクセスキーを設定していますが、
EC2インスタンスにロールを設定すれば、アクセスキーの設定は不要です。

[root@centos701 ~]# cat /usr/local/sbin/aws_ssh_key.sh
#!/bin/bash

export AWS_ACCESS_KEY_ID=<アクセスキー>
export AWS_SECRET_ACCESS_KEY=<シークレットアクセスキー>
export AWS_DEFAULT_REGION=ap-northeast-1

LOG=/tmp/debug.log
exec > >(tee ${LOG}) 2>&1

user=$1

id=`aws iam list-ssh-public-keys \
    --user-name "${user}" \
    --query "SSHPublicKeys[?Status=='Active'].[SSHPublicKeyId]" \
    --output text`

aws iam get-ssh-public-key \
    --user-name ${user} \
    --ssh-public-key-id "${id}" \
    --encoding SSH \
    --query "SSHPublicKey.SSHPublicKeyBody" \
    --output text


実行権限をつけます。
[root@centos701 ~]# chmod +x /usr/local/sbin/aws_ssh_key.sh

試しに動かしてみます。
以下のように、引数に user01 を指定して、上記1で登録した公開鍵が表示されたらOKです。
[root@centos701 ~]# /usr/local/sbin/aws_ssh_key.sh user01
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFcuCzHvzR3epwYjydZ+ge0mpXLfjV69fG9JbS2xAdfh5LGKOXnUKyFPFzZHIS31yg0wQBgzISaR4r3uPJ6WePh2Kx3LgX/cJoUCeKfVWPngoxyvu7f4wOlgehP8RCQ4Fs3OoCIlaT56zJYLR+r6hirdGoAdi3gq5Tp42628V5aMSyWCFn2k3LGZJOsUfEfjHWWeOQsujKjv/XlXoBFIf5p4kwClzV31KOtMex5CeuM0QPmJM2syjONmJ1WqARVRZgLuuXMkdD0cYlBSQd2gMf4ujf/CIuXirYNuyG3BY4tJFbFRHCKsXqzc1FvvVaU2+fJBwxsq/jtBGEXdFeCcp9

3. sshd_config の設定


/etc/sshd/sshd_config を下記のように修正します。
CentOS7の場合は、コメントアウトされていたので、# を削除して設定します。
AuthorizedKeysCommand /usr/local/sbin/aws_ssh_key.sh
AuthorizedKeysCommandUser nobody

sshd を reload します。
[root@centos701 ~]# systemctl reload sshd


4. ssgログインの動作確認 


サーバには、IAMユーザと同じ名称でユーザを用意します。
user01の公開鍵は、サーバには設定していません。
[root@centos701 home]# id user01
uid=1000(user01) gid=1000(user01) groups=1000(user01)
[root@centos701 home]# ls -al /home/user01
合計 20
drwx------  2 user01 user01  92  2月 25 00:18 .
drwxr-xr-x. 5 root   root    47  2月 25 00:20 ..
-rw-------  1 user01 user01  15  2月 25 00:18 .bash_history
-rw-r--r--  1 user01 user01  18  9月  7  2017 .bash_logout
-rw-r--r--  1 user01 user01 193  9月  7  2017 .bash_profile
-rw-r--r--  1 user01 user01 231  9月  7  2017 .bashrc
-rw-r--r--  1 user01 user01 334  9月 20  2017 .emacs

上記1で作成した、秘密鍵でログインします。
[root@centos701 ~]# ssh -i .ssh/id_rsa -l user01 localhost
Last login: Sat Jul  7 20:27:09 2018 from localhost

AWSに公開鍵を取りに行くので、ログインに、少し、時間がかかります。

下記の記事と、組み合わせると、いいかもしれない。
AuthorizedKeysCommandを使うと、記事の authorized_keysの作成は不要になります。
IAMで踏み台ホストのユーザーとSSH公開鍵を一元管理する