by shigemk2

当面は技術的なことしか書かない

curl 7.73.0

  • curl: add --output-dir
  • curl: support XDG_CONFIG_HOME to find .curlrc
  • curl: update --help with categories
  • curl_easy_option_*: new API for meta-data about easy options
  • CURLE_PROXY: new error code
  • mqtt: enable by default
  • sftp: add new quote commands 'atime' and 'mtime'
  • ssh: add the option CURLKHSTAT_FINE_REPLACE
  • tls: add CURLOPT_SSL_EC_CURVES and --curves

curl - Changes

リリース動画あった

IAMアクセスキーが登録されたSecrets ManagerのシークレットをローテートするLambdaなんだけど

IAMアクセスキーが登録されたSecrets ManagerのシークレットをローテートするLambdaなんだけど

良さそうなんだけど、なんかいくつか微妙な問題を抱えており

  • このLambdaを回すのに別のIAMシークレット(iam:CreateAccessKey iam:DeleteAccessKeyの権限をもってる)が必要(なぜだ)
    • とりあえずこれ自体はmasterarnを使わないでLambdadにIAMの権限を持たせればいい
  • 処理は古いアクセスキー削除→アクセスキー作成→Secrets Mangager更新の順にやっているけどSecrets Mangager更新にだけ失敗しても別にロールバックとかされないしそこらへんに例外処理は入ってない

自動でIAMをローテートするには早すぎる気持ちを得られた

LimitExceededException: An error occurred (LimitExceeded) when calling the CreateAccessKey operation: Cannot exceed quota for AccessKeysPerUser: 2

[ERROR] LimitExceededException: An error occurred (LimitExceeded) when calling the CreateAccessKey operation: Cannot exceed quota for AccessKeysPerUser: 2

LambdadでIAMのアクセスキーを作成しようとすると以下エラー出た。

思い出したけど、IAM ユーザーに割り当てられるアクセスキーが2までがデフォルトなので3つ以上アクセスキーを作成しようとすると(通常は)エラーになる。

buildspec メモ

buildspecでSecrets Managerの値を取得できる。 ただ、Secrets Managerからの値で設定した環境変数と、Code Buildの環境変数は、Code Buildのほうが強いらしい。

env:
  shell: shell-tag
  variables:
    key: "value"
    key: "value"
  parameter-store:
    key: "value"
    key: "value"
  exported-variables:
    - variable
    - variable
  secrets-manager:
    key: secret-id:json-key:version-stage:version-id
  git-credential-helper: no | yes

CloudFornationでSecrets Managerのシークレットの値を参照しようとするときにcould not parse secret string json

Secrets Managerの値をCloudFormationから参照する

いいやつの例

{
  "accesskey": "AKIAIOSFODNN7EXAMPLE",
  "secretkey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
  "username": "user"
}

ダメなやつの例

{
  "accesskey": "AKIAIOSFODNN7EXAMPLE",
  "secretkey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
  "username": "user",
}

ダメなやつの書き方をするとcould not parse secret string jsonってなるっぽい

check where security group is used

check where security group is used

EC2 SGに関連づけられたリソースを検索するにはEC2のネットワークインターフェイスから対象SGで検索する。EC2/SG/ALB/RDSなんがしかリソース割り当ててたら検索結果に出てくる。何も引っ掛からなかったらなんにも割り当てられていない。

フィルタ条件に一致するネットワークインターフェイスが見つからないというメッセージを受け取る場合、セキュリティグループに関連付けられているリソースはありません。

もしくはこっち

$ aws ec2 describe-network-interfaces --filters Name=group-id,Values=<group-id> --region <region> --output json

circular dependency

CloudFormationで2つのリソースが相互に依存参照しあっている状態だとエラーになる。マネコン的にはテンプレートを登録したタイミングでエラーが出る。 同じリソースで同じリソースを参照しようとするのもNG

参考画像

Handling circular dependency errors in AWS CloudFormation | Infrastructure & Automation

まあそれはそうだよねっていうきもち。

IAMのアクセスキーとシークレットキーが登録されているSecrets ManagerでローテーションさせるLambda

IAMのアクセスキーとシークレットキーが登録されているSecrets ManagerでローテーションさせるLambda。 プルリク自体は良いのにわりかし放置されているのがつらい。

ローテーションでLambdaを実行するには、最終的にこんな感じのリソースベースのポリシーが必要。

{
  "Version": "2012-10-17",
  "Id": "default",
  "Statement": [
    {
      "Sid": "EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE",
      "Effect": "Allow",
      "Principal": {
        "Service": "secretsmanager.amazonaws.com"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "<arn of the Lambda function that this trust policy is attached to - must match exactly>"
    }
  ]
}

リソースベースポリシー(Permission)とかちゃんとしないといけないから結局CloudFormationでLambda作った。 awscliでpermissionを追加する感じだし、マネコンじゃリソースベースポリシー登録できないんじゃないかな。 permissionを正しく設定しないとローテーションを登録するタイミングで権限ないって怒られる。

関数ポリシーがprincipal secretsmanager.amazonaws.comへのアクセスを許可していることを確認してください

登録はできたけど、問題点としては、以下。

  • Secrets Managerでアクセスキーとシークレットキーが対になるようにシークレットを予め登録しておく必要がある
  • このローテーション用Lambdaでは新キー作成、シークレットを新キーに更新、旧キー無効化、旧キー削除をいっぺんにやってしまう 新キー作成とシークレット更新は同時だけど、同じユーザーでキーが2つ以上発行されていたら古い方から消していく
  • ローテーションは複数登録できない
  • ローテーションの実行タイミングはざっくりしすぎてて曜日や時間を細かく指定できない