보안 키 없이 GitHub 작업을 통해 AWS 사용
모든 것은 다음과 같은 질문에서 시작되었습니다. How do we safely store AWS IAM User Keys (Access and Secret) created by IaC ?
다음 시나리오를 상상해 보십시오. 프론트엔드 자산을 호스팅할 버킷이 있습니다. 프론트엔드는 다른 리포지토리에 있고 내 예에서는 GitHub 작업을 사용하여 해당 파일을 버킷에 배포(이동)합니다. GitHub 작업에 권한을 부여하여 그 작업만 수행하려고 합니다.
물론 자격 증명을 저장소에 추가할 수 있지만 너무 많은 권한을 부여하게 됩니다.
인프라에서 GitHub 작업에 필요한 권한만 있는 사용자를 생성할 수 있습니다. 이것은 이미 훨씬 더 좋게 들립니다. 문제는 이 사용자의 키를 어디에 저장합니까?
위의 모든 단계는 어느 정도 작동합니다. 수동 작업이 필요하지 않은 유일한 옵션은 보안이 가장 낮은 옵션 1입니다.
내 이해에서 가장 좋은 접근 방식은 또 다른 접근 방식입니다. AWS CDK를 사용하여 설정하는 방법과 단계별로 살펴보고 싶습니다.
오픈아이디 커넥트(OIDC)
2021년 10월부터 GitHub Actions는 다음을 허용합니다. https://github.blog/changelog/2021-10-27-github-actions-secure-cloud-deployments-with-openid-connect/
OpenID Connect를 사용하면 외부 공급자(GitHub 작업)를 AWS 계정에 연결할 수 있습니다. 자세한 내용은 여기에서 읽을 수 있습니다. https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_oidc.html
외부 공급자는 필요한 권한(정책)이 있는 정의된 역할을 맡습니다. IAM 역할에 대한 자세한 내용은 여기에서 확인할 수 있습니다. https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html
단계별로 나누기:
GitHub 및 AWS에는 이에 대한 광범위한 문서가 있습니다.
코드에서 어떻게 보입니까?
const bucket = new Bucket(this, "Bucket");
const provider = new OpenIdConnectProvider(this, "GitHubProvider", {
url: "https://token.actions.githubusercontent.com",
clientIds: ["sts.amazonaws.com"], // Referred as "Audience" in the documentation
});
const role = new Role(this, "Role", {
assumedBy: new OpenIdConnectPrincipal(provider, {
StringEquals: {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com", // "Audience" from above
},
StringLike: {
"token.actions.githubusercontent.com:sub":
"repo:<ORGANIZATION>/<REPOSITORY>:*", // Organization and repository that are allowed to assume this role
},
}),
});
위의 예는 GitHub에서 문서화한 것과 약간 다릅니다. 여기에서 더 유연하게 만들고 있습니다(예: 모든 분기에서 사용할 수 있음).
assumedBy
속성은 다음과 같이 사용자 지정할 수 있습니다.bucket.grantPut(role);
배포가 완료되면 AWS 측에서 모든 것이 준비되었으므로 이제 GitHub 측으로 이동합니다.
# Before
...
- name: Configure AWS Credentials 🔧
uses: aws-actions/[email protected] # Version at the time of this writing
with: # We are loading keys stored in secrets
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: eu-central-1
- run: npm run deploy # Just an example
# After
...
permissions:
id-token: write
contents: read # This is required for actions/checkout (GitHub documentation mentions that)
...
- name: Configure AWS Credentials 🔧
uses: aws-actions/[email protected] # Version at the time of this writing
with: # We are loading keys stored in secrets
role-to-assume: arn:aws:iam::<ACCOUNT>:role/<ROLE-NAME> # You can specify the role name when creating it or AWS will automatically generate one for you
aws-region: eu-central-1
- run: npm run deploy # Just an example
이제 GitHub에서 비밀을 안전하게 제거할 수 있으며 GitHub Actions를 통해 배포하기 위해 "특별한"사용자가 필요하지 않습니다.
이것은 지식을 "포장"하는 데 많은 도움이 되며 다른 사람들에게도 도움이 될 수 있다고 믿습니다.
참조:
Reference
이 문제에 관하여(보안 키 없이 GitHub 작업을 통해 AWS 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/viniciuskneves/use-aws-through-github-actions-without-secret-keys-32eo텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)