aws secret manager cross account copy

Thank you for reading this post, don't forget to subscribe!

есть зада­ча из одно­го aws account копи­ро­вать secret создан­ный в aws secret manager в дру­гой aws account

1857432660 (источ­ник, сек­рет test-secret)
4507032160 (при­ём­ник)


общий смысл такой:
в акка­ун­те источ­ни­ке вы меня­е­те сек­рет, дан­ное собы­тие ловит cloudtrail, собы­тие в cloudtrail видит eventbridge и три­ге­рит в акка­ун­те (при­ём­ни­ке) lamda, кото­рая идёт в сек­рет в акка­ун­те источ­ни­ке заби­ра­ет исполь­зуя kms ключ дешиф­ру­ет сек­рет и далее запи­сы­ва­ет все изме­не­ния в свой сек­рет в акка­ун­те приёмнике.

 

  1. создаём kms ключ:  (account 1857432660)

KMS - > Customer managed keys  → create key

Key type = Symmetric
Key usage = Encrypt and decrypt

Advanced options = KMS - recommended   и Multi-Region key

Alias = alias/sm-test-secret

на шаге

Define key usage permissions - optional    для Other AWS accounts   добав­ля­ем акка­ун­ты кото­рым мож­но исполь­зо­вать этот ключ. в моём слу­чае это 4507032160
без это­го клю­ча сек­рет нель­зя будет пере­дать в дру­гие акка­ун­ты, так как сек­рет будет зашиф­ро­ван дефолт­ным ключом. 

 

  2. создаём cloudtrail (account 1857432660)

CloudTrail → Trails → create trail   если ниче­го не созда­но, то созда­ём по умол­ча­нию, он и бакет сам создаст и имя дефолт­ное задаст management-events. Этот trail нужен что­бы собы­тия об изме­не­ни­ях мог отсле­дить eventbridge

 

 3.  создаём секрет в aws secret manager и вешаем на него созданный нами kms ключ   (account 1857432660)

AWS Secrets Manager → Secrets → store a new secret
созда­ём сек­рет test-secret
так же на этот сек­рет веша­ем policy  Resource permissions - optional

в нём мы ука­зы­ва­ем Principal  arn role (sm-mirror-exec)  кото­рую мы потом созда­дим в акка­ун­те 4507032160
и зада­ём какие дей­ствия мож­но выпол­нять с нашим сек­ре­том. в Resource ука­зы­ва­ем arn наше­го сек­ре­та к кото­ро­му мы выда­ём доступ.

 

 

  4. создаём iam role для lambda.  (account 4507032160) 

IAM →  Roles → create role → Custom trust policy 

 

вот это inline policy:

в этой policy мы раз­ре­ша­ем ходить в сек­рет в акка­ун­те 1857432660 и делать kms Decrypt а так­же ходить в сек­рет в теку­щем акка­ун­те 4507032160 и обнов­лять секрет

роль сохра­ня­ем с име­нем sm-mirror-exec,

arn это роли arn:aws:iam::4507032160:role/sm-mirror-exec  он как раз был нужен на 3ем шаге этой инструкции.

 

 

   5. создаём lambda  (account 4507032160)

Lambda → Functions → create function

Author from scratch
Function name = sm-mirror-test-secret
Runtime = Python 3.12
Architecture = x86_64
Change default execution role → Use an existing role = sm-mirror-exec

create function

далее пере­хо­дим в эту lambda и в Code добавляем:

сохра­ня­ем и переходим
Configuration → Environment variables
и добав­ля­ем сле­ду­ю­щие переменные:

SOURCE_REGION us-east-1
SOURCE_SECRET_ARN arn:aws:secretsmanager:us-east-1:1857432660:secret:test-secret-FTI7tY
TARGET_REGION us-east-1
TARGET_SECRET_NAME test-secret

далее пере­хо­дим в
Configuration → Permissions → Resource-based policy statements → Add permissions

там запол­ня­ем:

Statement ID  = AllowEventBridgeInvoke
Principal = 1857432660
Action = lambda:InvokeFunction

Save

 

       6. создаём IAM role для eventbridge (account 1857432660)

что­бы раз­ре­шить EventBridge вызы­вать Lambda в target account 4507032160 нуж­но создать execution-роль для EventBridge

IAM → Roles → create role → Custom trust policy

далее захо­дим в роль → Permissions → Add permisstions → Create inline policy

Policy name = evb-to-lambda-b

 

   7. создаём eventbridge (account 1857432660)

Event buses можем исполь­зо­вать дефолт­ный, созда­дим rule

Amazon EventBridge → Rules → Create rule
Name = SecretChangeInvokeLambda
Rule type = Rule with an event pattern
Event source = Other
Event pattern = Custom pattern (JSON editor)

 

Target types = AWS service
Select a target = Lambda function
Target location = Target in another AWS account
Function = arn:aws:lambda:us-east-1:4507032160:function:sm-mirror-test-secret
Execution role = 
create

 

проверяем:

доба­вим сек­рет в 1857432660 он  обно­вит­ся в 4507032160

смот­рим как отра­бо­та­ла lambda в мони­то­рин­ге всё ок