コマンド出力:aws s3api get-bucket-policy --bucket bucketname
{
"Policy": "{\"Version\":\"2012-10-17\",\"Id\":\"S3SecureTransportPolicy\",\"Statement\":[{\"Sid\":\"ForceSSLOnlyAccess\",\"Effect\":\"Deny\",\"Principal\":{\"AWS\":\"*\"},\"Action\":\"s3:*\",\"Resource\":\"arn:aws:s3:::amn/*\",\"Condition\":{\"Bool\":{\"aws:SecureTransport\":\"false\"}}},{\"Sid\":\"AWSCloudTrailAclCheck20150319\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"cloudtrail.amazonaws.com\"},\"Action\":\"s3:GetBucketAcl\",\"Resource\":\"arn:aws:s3:::amn\"},{\"Sid\":\"AWSCloudTrailWrite20150319\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"cloudtrail.amazonaws.com\"},\"Action\":\"s3:PutObject\",\"Resource\":\"arn:aws:s3:::amn/AWSLogs/405042254276/*\",\"Condition\":{\"StringEquals\":{\"s3:x-amz-acl\":\"bucket-owner-full-control\"}}}]}"
}
aws:SecureTransport
このJSONでは、キーに関連付けられた値(この場合false
)とキーに関連付けられた値をgrep(抽出)する必要がありますEffect
。
頑張った
aws s3api get-bucket-policy --bucket amn |
grep -Po '"Bool": *\K"[^"]*"'
そして
aws s3api get-bucket-policy --bucket amn |
sed 's/.*\(aws:SecureTransport\)[^:]*:"\([0-9]*\)"'
どうすればいいですか?
答え1
コマンドから取得したJSON文書に、他のエンコードされたJSON文書が含まれているようです。このエンコードされたドキュメントからデータをインポートしたいようです。
内部文書を入手するには、次のものを使用できますjq
。
aws ... |
jq -r '.Policy'
Effect
キーを含むビットからキー値を取得するには、aws:SecureTransport
文書を再解析する必要があります。
aws ... |
jq -r '.Policy' |
jq -r '.Statement[] | select(.Condition.Bool."aws:SecureTransport").Effect'
最後のjq
呼び出しは配列のすべての要素を繰り返して、名前付きキーを持つStatement
要素を探します.Condition.Bool."aws:SecureTransport"
。次に、Effect
その要素に関連するキー値を取得しますStatement
。
データに対してこの出力値を実行しますDeny
。
.Condition.Bool."aws:SecureTransport"
false
文書でそのキーの値が必要な場合は、.Condition.Bool."aws:SecureTransport"
上記を使用してください.Effect
。
または、2番目の呼び出しの代わりにfromjson
ディレクティブを使用してください。jq
jq
aws ... |
jq -r '.Policy | fromjson | .Statement[] | select(.Condition.Bool."aws:SecureTransport").Effect'
ここでは、fromjson
エンコードされたJSONドキュメントがデコードされ、後処理ステップに渡されます。
ちなみに、内部的にエンコードされたJSONドキュメントは次のようになります(aws ... | jq -r '.Policy | fromjson'
)。
{
"Version": "2012-10-17",
"Id": "S3SecureTransportPolicy",
"Statement": [
{
"Sid": "ForceSSLOnlyAccess",
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::amn/*",
"Condition": {
"Bool": {
"aws:SecureTransport": "false"
}
}
},
{
"Sid": "AWSCloudTrailAclCheck20150319",
"Effect": "Allow",
"Principal": {
"Service": "cloudtrail.amazonaws.com"
},
"Action": "s3:GetBucketAcl",
"Resource": "arn:aws:s3:::amn"
},
{
"Sid": "AWSCloudTrailWrite20150319",
"Effect": "Allow",
"Principal": {
"Service": "cloudtrail.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::amn/AWSLogs/405042254276/*",
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control"
}
}
}
]
}
答え2
まず、しないでください!jq
の説明に従って使用してください。コサロナンダの答え。これは正規表現を操作するよりも強力な解決策です。つまり、これを行う1つの方法は次のとおりですgrep
。
aws ... | grep -oP 'aws:SecureTransport.":."\K.+?(?=\\")'
これを検索し、aws:SecureTransport
文字(.
;\\
エスケープスラッシュを書くよりも簡単です)を見つけます"
。\K
これまでに一致したすべての項目(したがって一致する部分aws:SecureTransport.":."
)を削除します。次に、最も短い文字列()を見つけて.+?
(\"
)を見つけます(?=\\")
。
サンプル出力を含むファイルでこのコマンドを実行すると、次のようになります。
$ grep -oP 'aws:SecureTransport.":."\K.+?(?=\\")' file
false