- Vuls という脆弱性スキャナーがありますが、それを Amazon EC2 に対して実行できるようにすることで、ある条件下で、サービスが滅ぶ可能性について説きます
$ ssh-keygen -N '' -f $HOME/.ssh/id_rsa_vuls
$ cat $HOME/.ssh/id_rsa_vuls.pub
ssh-rsa ...
ec2-user$ sudo adduser -m vuls
ec2-user$ sudo su vuls
vuls$ mkdir -m 700 /home/vuls/.ssh
vuls$ echo 'ssh-rsa ...' > /home/vuls/.ssh/authorized_keys
$ mkdir vuls
$ cat <<EOD > vuls/config.toml
[servers]
[servers.amazon]
host = "203.0.113.1"
port = "22"
user = "vuls"
keyPath = "/root/.ssh/id_rsa_vuls"
EOD
$ docker run --rm -it -v $HOME/.ssh:/root/.ssh:ro -v $PWD:/vuls -v $PWD/vuls-log:/var/log/vuls vuls/vuls scan
$ for i in `seq 2002 $(date +"%Y")`; do docker run --rm -it -v $PWD:/vuls -v $PWD/go-cve-dictionary-log:/var/log/vuls vuls/go-cve-dictionary fetchnvd -years $i; done
$ docker run --rm -it -v $HOME/.ssh:/root/.ssh:ro -v $PWD:/vuls -v $PWD/vuls-log:/var/log/vuls vuls/vuls report
- これによって、ユーザが認証情報を管理する必要がなくなるため、アプリケーションサーバとしての EC2 に、様々な権限を持つロールをアタッチするケースが考えられます
- ユーザが意識することはありませんが、内部的には、アタッチされているロールと対応した一時的な認証情報が存在し、当該の EC2 インスタンス上からのみ、下記のように取得できます
ec2-user$ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/role_name
- ここで、前述の vuls アカウントに SSH ログインして、同じことが可能か試しましょう
$ ssh -t -i $HOME/.ssh/id_rsa_vuls vuls@203.0.113.1 'curl http://169.254.169.254/latest/meta-data/iam/security-credentials/role_name'
{
"Code" : "Success",
"LastUpdated" : "2017-06-27T09:17:33Z",
"Type" : "AWS-HMAC",
"AccessKeyId" : "ASIAJHNLJH7SISLPSOMA",
"SecretAccessKey" : "...",
"Token" : "...",
"Expiration" : "2017-06-27T15:39:38Z"
}Connection to 203.0.113.1 closed.
- したがって、SSH 秘密鍵 "id_rsa_vuls" は、EC2 にアタッチされているロールによっては、高いレベルで保護する必要があります
- しかし、その認識にギャップがあると思われ、次のように扱われる懸念があります
- 脆弱性スキャンを自動実行させるため、秘密鍵にパスフレーズを設定しない
- 秘密鍵が置かれる、スキャン実行ホストのセキュリティレベルが低い、アクセス制御が徹底されていない
- ロールによる権限を得られるべきではない外部のメンバー等が、スキャンを実行するために、秘密鍵へのアクセス権を持っている
- EC2 に重要な IAM ロールがアタッチされており、なんらかの形で、秘密鍵が攻撃者の手に渡った場合、サービスに対してバルス的な影響を及ぼす恐れがあります
- vuls アカウントに設定することで、Vuls の実行のみが許可され、その他のコマンドは無視されます
vuls$ curl https://raw.githubusercontent.com/asannou/vuls-ssh-command/master/amazon-linux.sh > /home/vuls/.ssh/vuls-ssh-command.sh
vuls$ chmod +x /home/vuls/.ssh/vuls-ssh-command.sh
vuls$ echo 'command="/home/vuls/.ssh/vuls-ssh-command.sh" ssh-rsa ...' > /home/vuls/.ssh/authorized_keys
$ ssh -t -i $HOME/.ssh/id_rsa_vuls vuls@203.0.113.1 'curl http://169.254.169.254/latest/meta-data/iam/security-credentials/role_name'
Connection to 203.0.113.1 closed.