速度の最適化について:5分で完全なAWSセキュリティとコンプライアンス走査をする方法


プロジェクトのSteamPortalは、高速プログラミング言語とインテリジェントキャッシングアプローチのアウトランニングprowler速度tenfoldを使用します.私はProwlersの限界を回避しようとしたが、私は最適化について多くを学んだ.

AWSセキュリティベストプラクティス


セキュリティを最初にサポートするには、ベストプラクティスとベンチマークに対してアカウントをチェックしてください.最も使用される2つは
AWS Foundational Security Best Practices AWSとCIS (インターネットセキュリティセンター)AWS Benchmark .
私は、広く使用されているツールのプロウラー(Git 5.1 Kの星)とSteampipe(Git 1.2 K STAR)とを比較して、それは良いアプローチを示します.

推進機


推進器自体を紹介する
それは、CIS、PCI - DSS、ISO 27001、GDPR、HIPA、FFIEC、SOC 2、AWS FTR、ENSとCustomomeセキュリティフレームワークをカバーしている200以上のコントロールを含みます

建築


アプリケーションはベースとしてAWS CLIとスクリプトスクリプトを実行します.クエリは、bashパイプとCLI“クエリ”構文の組み合わせで行われます.これは、最初に簡単に実装を制御することができます.

bashスクリプトは各AWS APIリクエストの後に待ちます.

スピード


そのアーキテクチャに関する問題は、スキャンが数時間まで30分かかることができるということです.
つのチェックを例として見ましょう.

例として


インchecks/check121 prowlerリポジトリから、このbashスクリプトを見つけます.

構成セクション


チェックの属性は環境変数に格納されます.
CHECK_ID_check122="1.22"
CHECK_TITLE_check122="[check122] Ensure IAM policies that allow full \"*:*\" administrative privileges are not created"
CHECK_SCORED_check122="SCORED"
CHECK_CIS_LEVEL_check122="LEVEL1"
CHECK_SEVERITY_check122="Medium"
CHECK_ASFF_TYPE_check122= "Software and Configuration Checks/Industry and Regulatory Standards/CIS AWS Foundations Benchmark"
CHECK_ASFF_RESOURCE_TYPE_check122="AwsIamPolicy"
CHECK_ALTERNATE_check122="check122"
CHECK_SERVICENAME_check122="iam"
CHECK_RISK_check122='IAM policies are the means by which privileges are granted to users; groups; or roles. It is recommended and considered a standard security advice to grant least privilege—that is; granting only the permissions required to perform a task. Determine what users need to do and then craft policies for them that let the users perform only those tasks instead of allowing full administrative privileges. Providing full administrative privileges instead of restricting to the minimum set of permissions that the user is required to do exposes the resources to potentially unwanted actions.'
CHECK_REMEDIATION_check122='It is more secure to start with a minimum set of permissions and grant additional permissions as necessary; rather than starting with permissions that are too lenient and then trying to tighten them later. List policies an analyze if permissions are the least possible to conduct business activities.'
CHECK_DOC_check122='http://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html'
CHECK_CAF_EPIC_check122='IAM'

コードセクション


  1 check122(){
  2   # "Ensure IAM policies that allow full \"*:*\" administrative privileges are not created (Scored)"
  3   LIST_CUSTOM_POLICIES=$($AWSCLI iam list-policies --output text $PROFILE_OPT --region $REGION --scope Local --query 'Policies[*].[Arn,Defau    ltVersionId]' | grep -v -e '^None$' | awk -F '\t' '{print $1","$2"\n"}')
  4   if [[ $LIST_CUSTOM_POLICIES ]]; then
  5     for policy in $LIST_CUSTOM_POLICIES; do
  6       POLICY_ARN=$(echo $policy | awk -F ',' '{print $1}')
  7       POLICY_VERSION=$(echo $policy | awk -F ',' '{print $2}')
  8       POLICY_WITH_FULL=$($AWSCLI iam get-policy-version --output text --policy-arn $POLICY_ARN --version-id $POLICY_VERSION --query "[Policy    Version.Document.Statement] | [] | [?Action!=null] | [?Effect == 'Allow' && Resource == '*' && Action == '*']" $PROFILE_OPT --region $REGION    )
  9       if [[ $POLICY_WITH_FULL ]]; then
 10         POLICIES_ALLOW_LIST="$POLICIES_ALLOW_LIST $POLICY_ARN"
 11       fi
 12     done
 13     if [[ $POLICIES_ALLOW_LIST ]]; then
 14       for policy in $POLICIES_ALLOW_LIST; do
 15         textFail "$REGION: Policy $policy allows \"*:*\"" "$REGION" "$policy"
 16       done
 17     else
 18         textPass "$REGION: No custom policy found that allow full \"*:*\" administrative privileges" "$REGION"
 19     fi
 20   else
 21     textPass "$REGION: No custom policies found" "$REGION"
 22   fi
 23 }
次のコードが実行されます.
1 .リストポリシー( line 3 )
$AWSCLI iam list-policies
(ループ5行目12行)
$AWSCLI iam get-policy-version

CLIスピード


各呼び出しのPythonでは、Pythonインタプリタが起動し、各呼び出しに時間がかかります.
私の言いたいことをお見せしましょう
time aws iam list-policies
aws iam list-policies  0,93s user 0,13s system 15% cpu 6,894 total
約7秒かかります.今“リストポリシー”は、時間割の高価な操作ですので、私は単純な1、S 3のリストを見てください.
どの部分がPythonの時間であり、どのAWS時間であるかを見るために、私は「AWS S 3 LS」をより速いGoアプリケーションと比較します.
これはAWS Python CLIです.
time aws s3 ls
aws s3 ls  0,46s user 0,07s system 72% cpu 0,726 total
今すぐあなたが言うことができる、端末出力はいくつかの時間がかかります.そこで、
time aws s3 ls >/dev/null
aws s3 ls > /dev/null  0,43s user 0,07s system 79% cpu 0,635 total
AWS CLI/Python用の合計で0.635秒

対照的に、小さな囲碁プログラムは時間がかかる.
time ./s3list >/dev/null
./s3list > /dev/null  0,01s user 0,01s system 11% cpu 0,183 total
主なコードがどこにあるのか
 res, err := client.ListBuckets(context.TODO(), &s3.ListBucketsInput{})
for _, bucket := range res.Buckets {
        bucketarray = append(bucketarray, bucket.Name)
}
return bucketarray, nil
コンパイルされた囲碁プログラムの合計0.183秒.
いくつかのあなたの言うことがあります:錆は、新しいスピード王- ok、試してみましょう
錆はより速くありえました.
しかし、現時点では、錆SDKはまだベータ版なので、行くよりも時間がかかるが、Pythonより高速です.
time target/debug/rust-s3 >/dev/null
target/debug/rust-s3 > /dev/null  0,15s user 0,03s system 43% cpu 0,403 total
コンパイルされたrustプログラムの合計で0.403秒cargo build .
これは錆コードです.
use aws_config::meta::region::RegionProviderChain;
use aws_sdk_s3::{Client, Error};
#[tokio::main]
async fn main() -> Result<(), Error> {
    let region_provider = RegionProviderChain::default_provider().or_else("eu-central-1");
    let config = aws_config::from_env().region(region_provider).load().await;
    let client = Client::new(&config);
    if let Err(e) = show_buckets(&client).await
    {
        println!("{:?}", e);
    };
    Ok(())
}
async fn show_buckets( client: &Client) -> Result<(), Error> {
    let resp = client.list_buckets().send().await?;
    let buckets = resp.buckets().unwrap_or_default();
    for bucket in buckets {
        println!("{}", bucket.name().unwrap_or_default());
    }
    println!();
    Ok(())
}

最適化


ご覧のように、コンパイルされた囲碁プログラムはPythonスクリプトよりずっと速いです.そこで私はCLIキャッシュでCLIを最適化しようとしました.
プロジェクトはhttps://github.com/megaproaktiv/awclip 実験として見てください.それはどうにか働きましたが、望ましい結果を作成しませんでした.
見つけたものは
  • AWS CLIは、サービスを呼ぶより多くのことをしています
  • AWS CLIは必ずしもJSONではありません.
  • チェック8行目を見る
    --query "[Policy    Version.Document.Statement]
    
    これはJSONで動作しますが、重要なAPIはEC2 API , S3 API and IAM JSONではなく、XMLで返答してください.
    したがって、“クエリ”関数を自分のプログラムに置き換えることは容易ではありません.
    最も有望なアプローチは並列に領域をプリフェッチすることであった.Prowlerはすべて順調に進んでいる.
    しかし、1日分の仕事で、私は、プロウェラーから10 %のより良い速度を得ました.それは、私が私の考えが間違っていると理解させました.
    私はローカルではなく、グローバルに最適化されました.
    あなたが本「ゴール」を読むならば、それは言います:
    同氏は、「われわれは、地元の楽観視には関係ない.
    それで、私のアプローチはAWS CLIをローカルの最適リードとして取り替えます.いくつかの研究の後、私は世界的な最適化アプローチを使用したプロジェクトを発見しました

    Steampipe -別のアプローチ


    SteamPortalはPostgresの外部データラッパーを使用して外部システムからのデータとサービスをデータベース表として提示します.

    クエリはAWS CLIのようにJSON上で実行されません.AWSデータは表で示され、問い合わせはそれらのテーブルに直接作用する.すべての結果がキャッシュされ、クエリはローカルのPostgresテーブルで動作します.
    だから私は同様のコントロールを見てcheck-122 , ここでは“Control : 1 IAMポリシーは完全に許可されてはいけません*”管理権限があります.クエリはSQLで書かれています.
    設定foundational_security/iam.sp ) は別のファイルの論理から分離され、以下のようになります.
    control "foundational_security_iam_1" {
      title         = "1 IAM policies should not allow full '*' administrative privileges"
      description   = "This control checks whether the default version of IAM policies (also known as customer managed policies) has administrator access that includes a statement with 'Effect': 'Allow' with 'Action': '*' over 'Resource': '*'. The control only checks the customer managed policies that you create. It does not check inline and AWS managed policies."
      severity      = "high"
      sql           = query.iam_custom_policy_no_star_star.sql
      documentation = file("./foundational_security/docs/foundational_security_iam_1.md")
    
      tags = merge(local.foundational_security_iam_common_tags, {
        foundational_security_item_id  = "iam_1"
        foundational_security_category = "secure_access_management"
      })
    }
    
    このクエリはquery/iam/iam_policy_no_star_star.sqlgithub repository
    prowlerでは、AWS CLIとパイプのいくつかのbash論理を使った問い合わせです.
    --query "[PolicyVersion.Document.Statement] | [] | [?Action!=null] | [?Effect == 'Allow' && Resource == '*' && Action == '*']"
    
    Steampipeでは構文はSQLです:
    with bad_policies as (
      select
        arn,
        count(*) as num_bad_statements
      from
        aws_iam_policy,
        jsonb_array_elements(policy_std -> 'Statement') as s,
        jsonb_array_elements_text(s -> 'Resource') as resource,
        jsonb_array_elements_text(s -> 'Action') as action
      where
        s ->> 'Effect' = 'Allow'
        and resource = '*'
        and (
          (action = '*'
          or action = '*:*'
          )
      )
      group by
        arn
    )
    
    Bashテキスト比較Effect == 'Allow' なるwhere s ->> 'Effect' = 'Allow' .

    SQLクエリの開発


    SQLステートメントを開発するにはsteampipe query コマンドは、ローカルSQLクエリツールを与える
    最初のステップは.tables AWSプラグインをインストールした後、すべてのAWSテーブルを取得します.

    検査を確認する


    二つ目のステップは、どのフィールドを問い合わせるかを調べることです.

    The .inspect コマンドはフィールドを表示します.
    クエリを使用して実験を開始します.
    > select policy_std from aws_iam_policy
    +----------------------------------------------------------------------------------------------------------------------
    | policy_std
    +----------------------------------------------------------------------------------------------------------------------
    | {"Statement":[{"Action":["logs:createloggroup",...
    
    JSONで動作する関数は、ポリシードキュメントを解釈できるようにします.jsonb_array_elements_text(s -> 'Action') as action
    次のステートメントで
    jsonb_array_elements(policy_std -> 'Statement') as s,
    jsonb_array_elements_text(s -> 'Resource') as resource,
    jsonb_array_elements_text(s -> 'Action') as action
    where
      s ->> 'Effect' = 'Allow'
      and resource = '*'
      and (
        (action = '*'
        or action = '*:*'
        )
    )
    
    今、我々はコントロールがどのように構築され、速度を見てみましょう知っている.

    シングルコントロールの速度


    速記で速度を上げる


    プロペラでシングルコントロールを実行すると、2分以上かかります.

    蒸気管で速度


    Steampipeでは、同じ結果を与えながら、23秒にダウンしています.

    スキャン全体の速度


    ときに、完全なスキャンを行うと、prowlerは1つの領域については約30分、Steampipeは3分で実行されます.
    たぶんあなたはこれを試してみたい-よくCloudShellあなたの友人です.
    ここにあなたのアカウントをチェックする完全な小さなチュートリアルです!

    ウォルトラフ入門


    手順は以下の通りです.
  • ダウンロードしてインストールするSteampipe
  • プラグインをインストール
  • 関連キーワード:クローンレポ
  • 生成AWS資格情報報告
  • 設定領域(オプション)
  • すべてのベンチマークを実行する
  • ダウンロードレポートファイル
  • 詳しくは
    1 .管理権を持つAWSアカウントへのログイン
    2 .クラウドシェルを開く

    3 .これらのコマンドを実行します.
    sudo /bin/sh -c "$(curl -fsSL https://raw.githubusercontent.com/turbot/steampipe/main/install.sh)"
    steampipe plugin install steampipe
    steampipe plugin install aws
    git clone https://github.com/turbot/steampipe-mod-aws-compliance.git
    cd steampipe-mod-aws-compliance
    aws iam generate-credential-report
    
    4 .(オプション)編集領域の設定
    特定の領域(s)をスキャンしたいならば、Configuration
    vi ~/.steampipe/config/aws.spc
    
      1 connection "aws" {
      2   plugin    = "aws"
      3 
      4   regions     = ["eu-central-1","us-east-1"]
      5 
      6 }
    
    行番号をコピーしないことをご存知ですか?
    証明書を待つ
    aws iam generate-credential-report
    
    レポートが実行されているときにこれを取得します.
    {
        "State": "STARTED",
        "Description": "No report exists. Starting a new report generation task"
    }
    
    これが完了したら
    {
        "State": "COMPLETE"
    }
    
    HTML出力を実行する
    steampipe check all --export=html
    
    これは3 - 5分だけかかる必要があります.
    実行中のプロセスを参照してください.

    ダウンロードレポート
    すべてのために探してください.HTML .ライクall-20220412-150100.htmlCloudShellのアクションメニューでHTMLファイルを「ダウンロード」できます.

    次のようにパス全体を書きます.

    さて、完全なレポートがあります.

    結論


    セキュリティスキャン


    多くの良いオープンソースAWSのコンプライアンスとセキュリティツールをスキャンしてgithubです.
    完全なレポートで-雲シェルのインストールを含む-約5分で、SteamPortalは私のツールのポートフォリオの新しい撮影スターです.私たちは長い目で見ればわかるだろう.
    あなたは本当にそれを試して10分かかる必要があります!

    最適化


    私が学んだこと
  • ローカル最適化する前にグローバルを好む.
  • ツールと言語には制限があります.
  • 代わりに、代わりに多くの時間を回避して回避策を探します.
  • コンパイルされるよりもコンパイルされます.
  • 一般的な声明を信用しないでください.あなたの信念に挑戦する可能性の概念の最小の証拠を書いてください.
  • フィードバックと議論


    議論のために私に連絡してください

    もっと学ぶ


    AWSでゴランを使用することについてもっと知りたいですか?AWSでGOを学んでください:here

    ソース

  • ゴンドラ,エリヤジェフコックス.目標:進行中の改善のプロセス.ノースリバープレス.キンドル版.
  • Steampipe check
  • Steampipe Hub
  • Prowler