Vuls で EC2 をバルスされないために

  • 以下に Vuls の単純化した使用方法を示します
  • 対象の EC2 (Amazon Linux) に SSH ログインするための鍵ペアを作成
$ ssh-keygen -N '' -f $HOME/.ssh/id_rsa_vuls
$ cat $HOME/.ssh/id_rsa_vuls.pub
ssh-rsa ...
  • 対象の EC2 でアカウントを作成
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
  • Vuls の設定ファイルを作成
$ 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
  • Vuls のスキャンを Docker で実行
$ docker run --rm -it -v $HOME/.ssh:/root/.ssh:ro -v $PWD:/vuls -v $PWD/vuls-log:/var/log/vuls vuls/vuls scan
  • CVE をダウンロード(30分程度)
$ 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
  • Vuls のレポートを表示
$ 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-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 にアタッチされているロールによっては、高いレベルで保護する必要があります
  • しかし、その認識にギャップがあると思われ、次のように扱われる懸念があります
    • 脆弱性スキャンを自動実行させるため、秘密鍵パスフレーズを設定しない
    • 秘密鍵が置かれる、スキャン実行ホストのセキュリティレベルが低い、アクセス制御が徹底されていない
    • ロールによる権限を得られるべきではない外部のメンバー等が、スキャンを実行するために、秘密鍵へのアクセス権を持っている
  • 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.
  • たぶんバグあり、Amazon LinuxUbuntu しか用意していませんが、よろしければお使いください