Github: https://github.com/Netflix/bless
BLESS – バスティオンのラムダエフェメラルSSHサービス
BLESSは、AWSラムダ関数として実行され、SSH公開鍵に署名するために使用されるSSH認証局です。
SSH証明書は、ユーザーが特定のSSHホストにアクセスできるようにする優れた方法です。単一のユースケースで制限され、短命になる可能性があります。 ホストのauthorized_keysを管理するのではなく、SSH秘密鍵にアクセスできる人を制御する代わりに、ホストはSSH CAを信頼するように設定する必要があります。
BLESSは、AWSラムダとして独立AWSアカウントで実行する必要があります。 BLESSはホストから信頼されているプライベートキーにアクセスする必要があるため、隔離されたAWSアカウントは、そのプライベートキーにアクセスできるユーザーを制限したり、実行しているBLESSコードを変更するのに役立ちます。
AWSラムダ関数はAWS IAMポリシーを使用して、どのIAMロールがラムダ関数を呼び出すことができるかを制限できます。 適切に設定されている場合は、SSH証明書を要求できるIAMロールを制限することができます。 たとえば、SSH Bastion(別名SSH Jump Host)は、そのSSH Bastionにアクセス可能なインスタンスによって信頼されているSSH CAキーで構成されたBLESSラムダファンクションを呼び出すためのアクセス権を持つ唯一のIAMロールで実行できます。
入門
これらの手順は、ローカル開発環境でBLESSを起動して実行することです。
インストール手順
レポをクローン:
$ git clone git@github.com:Netflix/bless.git
bless repoへのCd:
$ cd bless
まだ作成していない場合は、virtualenvを作成します。
$ virtualenv venv
venvを有効にする:
$ source venv/bin/activate
パッケージとテストの依存関係をインストールする:
(venv) $ make develop
テストを実行します。
(venv) $ make test
配置
AWSラムダ関数をデプロイするには、コードとすべての依存関係を.zipで指定する必要があります。 .zipには、.zipの最上位にラムダコードと設定が含まれている必要があります。 BLESS Makefileには、パブリッシュ対象が含まれており、すべてが展開可能な.zipが予定された場所にある場合にパッケージ化されます。
BLESSラムダ依存関係のコンパイル
AWS Lambdaにはいくつかの制限があり、コードをLambda関数として展開するには、すべての依存関係をパッケージ化する必要があります。 AWS LambdaはPython 2.7のみをサポートし、BLESSは暗号化に依存します。これはコンパイルする必要があります。 AWSラムダを公開する前に、依存関係をコンパイルして含める必要があります。
amazon linuxを実行しているドッカーコンテナを使うことができます:
-
make lambda-deps
を実行make lambda-deps
と、コンテナが実行され、./aws_lambda_libsにすべての依存関係が保存されます。
または、次の操作を実行できます。
- Amazon Linux AMIを導入する
- そのインスタンスへのSSH
- BLESSの
setup.py
をインスタンスにコピーする -
bless/__about__.py
のbless/__about__.py
をbless/__about__.py
のインスタンスにコピーbless/__about__.py
- BLESSの依存関係をインストールする:
$ sudo yum install gcc libffi-devel openssl-devel
$ virtualenv venv
$ source venv/bin/activate
(venv) $ pip install --upgrade pip setuptools
(venv) $ pip install -e .
- そのインスタンスから、以下の内容をコピーします。
$ cp -r venv/lib/python2.7/site-packages/. aws_lambda_libs
$ cp -r venv/lib64/python2.7/site-packages/. aws_lambda_libs
- これらのファイルを以下の場所に置く:./aws_lambda_libs/
CA秘密鍵の保護
- パスワードで保護されたRSA秘密鍵を生成する:
$ ssh-keygen -t rsa -b 4096 -f bless-ca- -C "SSH CA Key"
- KMSを使用してパスワードを暗号化します。 地域ごとにKMSキーが必要となり、各地域のパスワードを暗号化する必要があります。 AWS Consoleを使用して、次のような単純なラムダ関数を貼り付けることができます:
import boto3
import base64
import os
def lambda_handler(event, context):
region = os.environ['AWS_REGION']
client = boto3.client('kms', region_name=region)
response = client.encrypt(
KeyId='alias/your_kms_key',
Plaintext='Do not forget to delete the real plain text when done'
)
ciphertext = response['CiphertextBlob']
return base64.b64encode(ciphertext)
- このレポ以外の秘密鍵.pemファイルとパスワードを管理します。
- bless_deploy.cfgを秘密鍵のファイル名と暗号化されたパスワードで更新します。
- 新しいラムダ.zipを公開する前に、必要な./lambda_configs/ca_key_name.pemを入力してください。
- ./lambda_configs/ca_key_name.pemのアクセス許可を444に設定します。
BLESS設定ファイル
- BLESS構成ファイルの例と付属のドキュメントを参照してください。
- このレポ以外のbless_deploy.cfgファイルを管理します。
- 新しいラムダ.zipを公開する前に、必要な./lambda_configs/bless_deploy.cfgを提供してください。
- ご使用の環境に必要な[Bless CA]オプション値を設定する必要があります。
- すべてのオプションは環境内で変更できます。 環境変数名は、section_name_option_name(すべて小文字、スペースはアンダースコアで置き換えられます)として作成されます。
ラムダ.zipを公開する
- 公開前に必要な./lambda_configs/ca_key_name.pemを入力してください
- 公開前に./lambda_configs/bless_deploy.cfgにBLESS構成ファイルを提供してください
- ./aws_lambda_libsでコンパイルされた依存関係を提供する
- 実行:
(venv) $ make publish
ラムダ要件
コード、設定、またはIAMポリシーを変更するアクセス権を持つユーザを制限するには、この機能を独自のAWSアカウントに導入する必要があります。 隔離されたアカウントは、SSH CAキーを保護するために使用されるKMSキーにアクセスできるユーザーを制限します。
BLESSラムダ機能は、独自のIAMロールとして実行する必要があり、機能が導入されている各地域でAWS KMSキーにアクセスする必要があります。 BLESS IAMRoleには、kms(kms:GenerateRandom)からランダムを取得する権限とCloudWatchログ(ログ:CreateLogGroup、ログ:CreateLogStream、ログ:PutLogEvents)へのログオン権限も必要です。
BLESSの使用
BLESSをデプロイすると、必要なAWS認証情報にアクセスできるシステムからサンプルBLESSクライアントを実行できます。
(venv) $ ./bless_client.py region lambda_function_name bastion_user bastion_user_ip remote_usernames bastion_source_ip bastion_command <id_rsa.pub to sign> <output id_rsa-cert.pub>
証明書の確認
ssh-keygenを使って証明書の内容を直接調べることができます:
$ ssh-keygen -L -f your-cert.pub
サーバーでのBLESS証明書の有効化
/ etc / ssh / sshd_configに次の行を追加します。
TrustedUserCAKeys /etc/ssh/cas.pub
/etc/ssh/cas.pubに、rootが所有し、rootだけが書き込み可能な新しいファイルを追加します。
ssh-rsa AAAAB3NzaC1yc2EAAAADAQ… #id_rsa.pub of an SSH CA
ssh-rsa AAAAB3NzaC1yc2EAAAADAQ… #id_rsa.pub of an offline SSH CA
ssh-rsa AAAAB3NzaC1yc2EAAAADAQ… #id_rsa.pub of an offline SSH CA 2
SSH CA鍵のローテーションを簡素化するには、複数のCA鍵をプロビジョニングし、それらを回転させる準備が整うまでオフラインのままにしてください。
TrustedUserCAKeysファイルに関する追加情報はこちら