GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

fugue

credstash – クラウド内の資格情報を管理するための小さなユーティリティ

投稿日:

クラウド内の資格情報を管理するための小さなユーティリティ

CredStash

クイックインストール

  1. (Linuxのみ)依存関係をインストールする
  2. pip install credstash
  3. KMSでcredstashというキーを設定する(IAMコンソールにあります)
  4. boto / botocoreが読むことができる場所にAWSクレジットがあることを確認してください
  5. credstash setup

Linuxのインストール時の依存関係

Credstashは最近PyCryptoからcryptography移行しました。 cryptographyは、OSXとWindowsではあらかじめ構築されたバイナリホイールを使用しますが、Linuxでは使用しません。 つまり、linuxでcredstashを実行する場合は、いくつかの依存関係をインストールする必要があります。

DebianとUbuntuの場合、次のコマンドを実行すると、必要な依存関係が確実にインストールされます。

$ sudo apt-get install build-essential libssl-dev libffi-dev python-dev

FedoraとRHEL派生の場合、次のコマンドを実行すると、必要な依存関係が確実にインストールされます。

$ sudo yum install gcc libffi-devel python-devel openssl-devel

どちらの場合でも、依存関係をpip install credstash 、いつものようにpip install credstashを実行できます。

詳細はhttps://cryptography.io/en/latest/installation/を参照してください

これは何ですか?

ソフトウェアシステムでは、しばしば共有クレデンシャルにアクセスする必要があります。 たとえば、Webアプリケーションは、データベースのパスワードまたは一部のサードパーティサービス用のAPIキーにアクセスする必要があります。

一部の組織では完全な資格管理システムを構築していますが、ほとんどの場合、これらの資格情報を管理することは通常は後で考慮する必要があります。 最善のケースでは、人は非常に良い仕事をするが、他の管理上の問題(マスターキーをどこに保存するかなど)につながる、安全なボールトのようなシステムを使用します。 信任状管理スキームの多くは、艦隊にsecretsファイルをSCPするだけです。または、最悪の場合、秘密をSCMに書き込むことになります( password github検索を実行しpassword )。

CredStashは、キーラッピングとマスターキーストレージにAWS Key Management Service(KMS)を使用し、資格情報の格納と共有にDynamoDBを使用する非常にシンプルで使いやすい資格情報管理および配布システムです。

他の言語との互換性

他の言語との信用できる互換性を提供するために、多くの素晴らしいプロジェクトが存在します。 ここに私たちが知っているものがあります(あなたが別のものを知っていれば自由にプルリクエストを開くことができます):

どのように機能するのですか?

Setupセクションの手順を完了すると、KMSの暗号化キー(このREADMEでは、そのキーをmaster keyと呼びmaster key )とDDBの資格情報格納テーブルが作成されます。

秘密を隠す

データベースパスワードなどの信任状を保管/共有する場合は、 credstash put [credential-name] [credential-value]実行するだけです。 たとえば、 credstash put myapp.db.prod supersecretpassword1234ます。 credstashはKMSに行き、独自のデータ暗号化キーを生成します。これはマスターキーで暗号化されます(これはキーラップと呼ばれます)。 credstashはデータ暗号化キーを使用してクレデンシャル値を暗号化します。 次に、暗号化された資格情報とラップされた(暗号化された)データ暗号化キーがDynamoDBの資格情報ストアに保存されます。

また、ファイルを参照するか、 stdin経由で秘密を渡すことによって、信任状を格納することもできます。 ファイルからシークレットを追加するには、シークレットを引数として渡すのではなく、 @記号の前にシークレットを含むファイルのファイル名を渡します。 たとえば、 credstash put myapp.db.prod @secret.txtます。 また、 -文字を秘密の引数として渡すことによって、 stdinを介して信任状を渡すこともできます。 たとえば、 tr -dc '[:alnum:]' < /dev/urandom | fold -w 32 | head -n 1 | credstash put myapp.db.prod - tr -dc '[:alnum:]' < /dev/urandom | fold -w 32 | head -n 1 | credstash put myapp.db.prod - tr -dc '[:alnum:]' < /dev/urandom | fold -w 32 | head -n 1 | credstash put myapp.db.prod -

秘密を得る

たとえば、Webサーバー上のブートストラップ・プロセスの一環として、信任状を取得する場合は、単にcredstash get [credential-name]ます。 たとえば、 export DB_PASSWORD=$(credstash get myapp.db.prod)ます。 getを実行get 、credstashが実行され、暗号化されたクレデンシャルとラップされた暗号化キーがクレデンシャルストア(DynamoDB)からフェッチされます。 その後、ラップされた暗号化キーがKMSに送信され、そこでKMSがマスターキーで復号化されます。 credstashは次に、暗号解読されたデータ暗号化キーを使用して信任状を解読します。 信任状はstdoutされるので、スクリプトで使用したり、環境変数に割り当てることができます。

秘密の制御と監査

必要に応じて、クレデンシャルに関連付けるEncryption Contextのキー値のペアをいくつでも含めることができます。 DynamoDBに格納されたときに資格情報に関連付けられた正確な暗号化コンテキストキー値ペアのセットは、資格情報を正常に復号化するget要求で指定する必要があります。 これらの暗号化コンテキストキー値のペアは、CloudTrailログの暗号化および復号化操作に監査コンテキストを提供するのに便利です。 また、KMSの重要なポリシー条件とKMS許可条件を使用して、指定されたcredstashに格納された資格情報へのアクセスを制限する場合にも便利です。 たとえば、データベースサーバーとWebサーバーがWebサーバーのユーザーパスワードを読み取ることができるが、データベースサーバーがWebサーバーのTLS / SSL証明書の秘密キーを読み取ることができないようにすることができます。 暗号化コンテキストを使用したput要求は、 credstash put myapp.db.prod supersecretpassword1234 app.tier=db environment=prodようになりますcredstash put myapp.db.prod supersecretpassword1234 app.tier=db environment=prod あなたのWebサーバーが同じ資格情報を読み取るgetは、 export DB_PASSWORD=$(credstash get myapp.db.prod environment=prod app.tier=db)ようなgetコールを実行しget

バージョン管理の秘密

資格証明ストアに格納された資格証明は、バージョン管理され、変更不可能です。 つまり、バージョン1と値bar持つfooという資格証明をputた場合、fooバージョン1の値は常にbarになり、 credstashにはその値を変更する方法はありません(ただし、 DDBのビットで、しかしあなたはそれをするべきではありません)。 資格情報のローテーションはバージョン間で行われます。 あなたがcredstash put foo bar後、 fooをローテートすることを決めたら、 credstash put foo baz -v実行してfooバージョン2を置くことができます。 次回にcredstash get fooすると、 bazが返されます。 特定の資格証明バージョンも取得できます(同じ-vフラグを使用)。 listコマンドを使用して、信任状ストア内のすべての信任状およびそのバージョンのリストを取り出すことができます。

増分整数バージョン番号(たとえば、 [1, 2, 3, ...] )を使用する場合は、 putコマンドで-aフラグを使用して自動的にバージョン番号を増やすことができます。 しかし、DynamoDBの辞書順ソートのために、 sys.maxintは、64文字の場合sys.maxintを処理するのに十分な19文字を除いて、バージョン表現にゼロ(たとえば[001, 025, 103, ...] sys.maxint [001, 025, 103, ...]ビットシステム)。

2015年12月以前にCredstash自動バージョン管理を使用しているユーザーのための特別な注意

2015年12月より前に、 credstashcredstashされていない整数で自動バージョン化されました。 これにより、キーが10個のバージョンに達すると、ソートエラーが発生しました。 数字ではないバージョン(日付、ビルドバージョン、名前など)を確実にサポートするために、辞書順ソートの動作は保持されましたが、自動バージョン管理の動作は左パッドの整数表現に変更されました。

これまでの自動バージョニングを使用した場合は、リポジトリのルートに含まれているcredstash-migrate-autoversion.pyスクリプトを実行する必要があります。 独自のバージョン番号を指定している場合は、バージョンの辞書形式の並べ替えが必要な結果を出すようにする必要があります。

依存関係

credstashは以下のAWSサービスを使用します:

  • AWS Key Management Service(KMS) – マスターキー管理とキーラップ用
  • AWSのアイデンティティとアクセス管理 – アクセス制御
  • Amazon DynamoDB – 資格情報ストレージ用

セットアップ

tl; dr

  1. KMSでcredstashというキーを設定する
  2. credstashのpython依存関係をインストールする(または単にpipを使う)
  3. boto / botocoreが読むことができる場所にAWSクレジットがあることを確認してください
  4. credstash setup実行credstash setup

KMSのセットアップ

credstashは現在あなたのKMSマスターキーを設定しません。 KMSマスターキーを作成するには、

  1. AWSコンソールに移動
  2. IAMコンソール/タブに移動します
  3. 左の「暗号化キー」をクリックします。
  4. [キーの作成]をクリックします。 エイリアスの場合は、 “credstash”を入力します。 別の名前を使用する場合は、必ず-kフラグを指定してcredstashに渡してください
  5. IAMプリンシパルがキーを管理できるようにする方法を決定する
  6. [Key Usage Permissions]画面で、credstashを使用するIAMユーザー/役割を選択します(後で気をつけることができます)
  7. 完了!

クレジットカードの設定

一番簡単な方法はpip install credstash実行pip install credstash それはcredstashとその依存関係(botoとPyCypto)をダウンロードしてインストールします。 代わりにpip install credstash[YAML]実行して、オプションのYAMLサポートを使用してcredstashをインストールすることもできます。

2番目に簡単なことは、 credstashディレクトリにpython setup.py installすることcredstash

credstashのpython依存関係はrequirements.txtファイルにあります。 pip install -r requirements.txtを使用してインストールできpip install -r requirements.txt

すべての場合、 PyCryptoをビルドするためのCコンパイラが必要PyCryptoapt-get install gccまたはyum install gcc apt-get install gccできます)。

boto / botocoreからAWS資格情報にアクセスする必要があります。 最も簡単な方法は、IAMの役割を持つEC2インスタンスでcredstashを実行することです。 あるいは、AWS資格情報をAWS_ACCESS_KEY_IDおよびAWS_SECRET_ACCESS_KEY環境変数に入れることもできます。 または、それらをファイルに入れることができます( http://boto.readthedocs.org/en/latest/boto_config_tut.htmlを参照)。

credstashが動作する領域を指定するには、 -rフラグを使用するか、環境変数AWS_DEFAULT_REGION設定します。 コマンドラインフラグは環境変数よりも優先されることに注意してください。 どちらも設定しないと、 credstashはus-east-1に対して動作します。

資格情報がcredstash setupれたら、 credstash setup実行しcredstash setup これにより、資格情報の格納に必要なDDBテーブルが作成されます。

複数のAWSアカウント(プロファイル)の操作

複数のAWSアカウントで作業する必要がある場合は、 ~/.aws/credentialsファイルに複数のプロファイルを設定するのが簡単です。 例えば、

[dev]
aws_access_key_id = AKIDEXAMPLEASDFASDF
aws_secret_access_key = SKIDEXAMPLE2103429812039423
[prod]
aws_access_key_id= AKIDEXAMPLEASDFASDF
aws_secret_access_key= SKIDEXAMPLE2103429812039423

次に、 AWS_PROFILE環境変数をプロファイルの名前(この場合はdevまたはprod)に設定することにより、適切なアカウントでcredstashを指定できます。

詳細については、 https://blogs.aws.amazon.com/security/post/Tx3D6U6WSFGOK2H/A-New-and-Standardized-Way-to-Manage-Credentials-in-the-AWS-SDKを参照してください

使用法

usage: credstash [-h] [-r REGION] [-t TABLE] [-p PROFILE | -n ARN] {delete,get,getall,list,put,setup} ...

A credential/secret storage system

delete
    usage: credstash delete [-h] [-r REGION] [-t TABLE] [-p PROFILE | -n ARN] credential

    positional arguments:
      credential  the name of the credential to delete

get
    usage: credstash get [-h] [-r REGION] [-t TABLE] [-p PROFILE | -n ARN] [-n] [-v VERSION]
                         credential [context [context ...]]

    positional arguments:
      credential            the name of the credential to get. Using the wildcard
                            character '*' will search for credentials that match
                            the pattern
      context               encryption context key/value pairs associated with the
                            credential in the form of "key=value"

    optional arguments:
      -n, --noline          Don't append newline to returned value (useful in
                            scripts or with binary files)
      -v VERSION, --version VERSION
                            Get a specific version of the credential (defaults to
                            the latest version)

getall
    usage: credstash getall [-h] [-r REGION] [-t TABLE] [-p PROFILE | -n ARN] [-v VERSION] [-f {json,yaml,csv,dotenv}]
                            [context [context ...]]

    positional arguments:
      context               encryption context key/value pairs associated with the
                            credential in the form of "key=value"

    optional arguments:
      -v VERSION, --version VERSION
                            Get a specific version of the credential (defaults to
                            the latest version).
      -f {json,yaml,csv,dotenv}, --format {json,yaml,csv,dotenv}
                            Output format. json(default), yaml, csv or dotenv.


list
    usage: credstash list [-h] [-r REGION] [-t TABLE] [-p PROFILE | -n ARN]

put
    usage: credstash put [-h] [-r REGION] [-t TABLE] [-p PROFILE | -n ARN] [-k KEY] [-v VERSION]
                         credential value [context [context ...]]

positional arguments:
  credential            the name of the credential to store
  value                 the value of the credential to store or, if beginning
                        with the "@" character, the filename of the file
                        containing the value, or pass "-" to read the value
                        from stdin
  context               encryption context key/value pairs associated with the
                        credential in the form of "key=value"

    optional arguments:
      -k KEY, --key KEY     the KMS key-id of the master key to use. See the
                            README for more information. Defaults to
                            alias/credstash
      -v VERSION, --version VERSION
                            Put a specific version of the credential (update the
                            credential; defaults to version `1`).
      -a, --autoversion     Automatically increment the version of the credential
                            to be stored. This option causes the `-v` flag to be
                            ignored. (This option will fail if the currently
                            stored version is not numeric.)
      -d {SHA,MD5,RIPEMD,SHA384,SHA224,SHA256,SHA512,WHIRLPOOL}, --digest {SHA,MD5,RIPEMD,SHA384,SHA224,SHA256,SHA512,WHIRLPOOL}
                            the hashing algorithm used to to encrypt the data.
                            Defaults to SHA256


setup
    usage: credstash setup [-h] [-r REGION] [-t TABLE] [-p PROFILE | -n ARN]

optional arguments:
  -r REGION, --region REGION
	                    the AWS region in which to operate. If a region is not
	                    specified, credstash will use the value of the
	                    AWS_DEFAULT_REGION env variable, or if that is not
	                    set, the value in `~/.aws/config`. As a last resort,
	                    it will use us-east-1
  -t TABLE, --table TABLE
	                    DynamoDB table to use for credential storage
  -p PROFILE, --profile PROFILE
	                    Boto config profile to use when connecting to AWS
  -n ARN, --arn ARN     AWS IAM ARN for AssumeRole

IAMポリシー

秘密の作家

Credstashへの秘密の設定は、KMS Key Grants、KMS Key Policies、またはIAM Policiesのいずれかを使用して行うことができます。 IAMポリシーを使用している場合は、以下のIAM権限がシークレットを作成または書き込むために最低限必要です。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "kms:GenerateDataKey"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:kms:us-east-1:AWSACCOUNTID:key/KEY-GUID"
    },
    {
      "Action": [
        "dynamodb:PutItem"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:dynamodb:us-east-1:AWSACCOUNTID:table/credential-store"
    }
  ]
}

キーポリシーまたは許可を使用している場合、 kms:GenerateDataKeyは、IAMユーザー/グループ/ロールのポリシーでは必須ではありません。 AWSACCOUNTIDをテーブルのアカウントIDに置き換え、KEY-GUIDをKMSキーの識別子(KMSコンソールにあります)に置き換えます。

シークレットリーダー

KMS Key Grants、KMS Key Policies、またはIAM Policiesのいずれかを使用して、getstallアクションまたはgetallアクションを使用してcredstashから秘密情報を読み取ることができます。 IAMポリシーを使用している場合は、以下のIAM権限がシークレットを取得または読み取るために最低限必要です。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "kms:Decrypt"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:kms:us-east-1:AWSACCOUNTID:key/KEY-GUID"
    },
    {
      "Action": [
        "dynamodb:GetItem",
        "dynamodb:Query",
        "dynamodb:Scan"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:dynamodb:us-east-1:AWSACCOUNTID:table/credential-store"
    }
  ]
}

鍵ポリシーまたは許可を使用している場合は、IAMユーザ/グループ/役割のポリシーでkms:Decryptは不要です。 AWSACCOUNTIDをテーブルのアカウントIDに置き換え、KEY-GUIDをKMSキーの識別子(KMSコンソールにあります)に置き換えます。 dynamodb:Scan getワイルドカードを使用していない場合、 dynamodb:Scan権限は必要ありません。

セットアップのアクセス許可

credstash setupを実行するには、次のDDB操作も実行できる必要があります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "dynamodb:CreateTable",
                "dynamodb:DescribeTable"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:dynamodb:us-west-2:<ACCOUNT NUMBER>:table/credential-store"
        },
        {
            "Action": [
                "dynamodb:ListTables"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}

セキュリティ上の注意

資格情報ストアのDDBテーブルからアイテムを取得し、KMS.Decryptを呼び出すことができるIAMプリンシパルは、格納された資格情報を読み取ることができます。

credstashのターゲットデプロイメントストーリーは、資格ストアを読み取ってマスターキーを使用する権限を持つIAMロールで実行されているEC2インスタンスです。 IAMロールの資格証明はインスタンスメタデータサービスによって販売されるため、デフォルトではシステム上のどのユーザーも資格をフェッチして資格情報の取得に使用できます。 つまり、デフォルトでは、インスタンス境界はこのシステムのセキュリティ境界です。 インスタンス上の権限のないユーザーが心配な場合は、インスタンスメタデータサービスへのアクセスを保護するための手順を実行する必要があります(たとえば、iptablesを使用して特権ユーザー以外の169.254.169.254への接続をブロックする)。 また、credstashはPythonで書かれているため、攻撃者がcredstashプロセスのメモリをダンプできれば、資格情報を回復できる可能性があります。 これは既知の問題ですが、再度ターゲット展開のケースでは、セキュリティ境界はインスタンス境界と見なされます。

クレジットカードの開発

テストの実行

python -m unittest discover -v tests "*.py"

よくある質問(FAQ)

1.マスターキーはどこに保管されていますか?

マスターキーはAWS Key Management Service(KMS)に格納され、セキュアなHSMバックアップストレージに格納されます。 マスターキーはKMSサービスから離れることはありません。

2.資格情報のローテーションはどのように処理されますか?

ストア内のすべての資格にはバージョン番号があります。 資格情報を新しい値に変更したい場合は、新しい資格情報のバージョンを使用してputを実行する必要があります。 たとえば、データベースにfooバージョン1がある場合、 fooを更新するにはバージョン2を指定します。手動でバージョンを指定することもできます(つまり、 credstash put foo bar -v 2 )か、 -aフラグバージョン番号をcredstash put foo baz -aインクリメントしようとします(たとえば、 credstash put foo baz -a )。 get操作を行うたびに、credstashは最新の(最高バージョン)バージョンの証明書をフェッチします。 したがって、資格情報のローテーションを行うには、単に新しいバージョンの資格証明書を入れるだけです。資格証明書をフェッチするクライアントは新しいバージョンを取得します。

3. credstashのコストを稼ぐために必要なAWSサービスの量

tl; dr:今日のDDBで25未満の読み取りと1秒あたり25の書き込みを使用している場合、credstashを使用するには1か月に1ドルの費用がかかります。

KMSのマスターキーは1か月に1ドルです。

資格情報ストアのDDBテーブルでは、1つのプロビジョニングされた読み取りと1つのプロビジョニングされた書き込みのスループットと、実際のストレージの少量が使用されます。 これは、DDBのフリー層(25回の読み取りと25回の書き込み/秒)のかなり下になります。 あなたが既に重いDDBユーザーであり、フリー層を超えている場合、信用証明書ストアテーブルの価格は月あたり約$ 0.53(主に書き込みスループット)です。

credstashを頻繁に使用しており、プロビジョニングされた読み取り/書き込みを増やす必要がある場合、追加料金が発生する可能性があります。 AWS Simple Monthly Calculator( http://calculator.s3.amazonaws.com/index.html#s=DYNAMODB )を使用して請求書を見積もることができます。

4.資格情報ストアとしてDynamoDBを使用するのはなぜですか? なぜS3でないのですか?

DDBはアプリケーションを本当にうまく収めます。 credstashがアプリケーションをスピンアップするクリティカルパスに入っていれば、待ち時間が非常に短いフェッチを持つことは本当に素晴らしいことです。 負荷と要件に基づいてスループットを上下させることも、設定管理ツールにあるべき素晴らしいことです。 また、credstashがより複雑な資格管理機能に入ると、DDBのクエリ機能が非常に便利になります。

つまり、S3サポートはいつか起こるかもしれません。

5. credstashのようなもののユースケースやコンテキストについての詳細はどこで知ることができますか?

このブログの記事をチェックしてください: http : //blog.fugue.it/2015-04-21-aws-kms-secrets.html







-fugue
-

執筆者: