terraform and gpg 세팅
terraform을 쓰는데 gpg가 왜 필요한가?
terraform 에서 IAM user를 만들면 임의의 패스워드가 설정이 되며 이 패스워드는 평문이다.
또 AWS api key를 만들경우에도 api key 가 평문으로 state 파일등에 남는다. 이 부분을 pgp를 이용하여 암호화해서 처리할 때 필요한 내용이다.
이런 기능이 필요할 경우에 사용을 하면 되며 terraform에서 user, api key를 관리하지 않는다면 설정할 필요가 없다.
gpg 세팅
사전에 devops팀용 gpg 임의의 패스워드 생성.
$ openssl rand -base64 32
gpg 설치 및 세팅방법 : terraform and gpg 세팅
terraform 에서 gpg 연동
참고자료
https://www.terraform.io/docs/providers/aws/r/iam_user_login_profile.html
https://rampart81.github.io/post/iam_config_terraform/
https://www.terraform.io/docs/providers/aws/r/iam_user_login_profile.html 문에서 pgp_key 항목을 보면 다음과 같다. base-64 인코딩된 pgp public key 를 이용하거나 keybase를 이용한다.
pgp_key
- (Required) Either a base-64 encoded PGP public key, or a keybase username in the form keybase:username
.
encrypted_password
- The encrypted password, base64 encoded.
NOTE: The encrypted password may be decrypted using the command line, for example: terraform output password | base64 --decode | keybase pgp decrypt
.
gpg public key를 export 한다.
이 과정에서는 -a 옵션을 주어서 ascii 형태로 만들면 안된다.
또한 terraform에서 base-64 인코딩이 필요하므로 public key를 export 하고 base64 프로그램으로 변환을 할 수도 있고 terraform 에서 base64encode fcuntion을 이용할 수도 있다.
아래의 경우에 gpg 의 secret key 설정은 이미 된 상태에서 진행을 한다. export 할 때 자신에게 필요한 keyring 을 지정해야 한다. 이 부분은 gpg에서 --list-secret-keys 명령으로 확인을 한다.
$ gpg --list-secret-keys --keyid-format LONG /Users/a201709045/.gnupg/pubring.kbx ------------------------------------ sec rsa4096/070DA6176D77C738 2018-07-03 [SC] 140EA1E9420D11A04C9F39DF070DA6176D77C738 uid [ unknown] devops <techdevops@example.com> ssb rsa4096/D97F547722330CDC 2018-07-03 [E] $ gpg --export 070DA6176D77C738 > devops-terraform.gpg
gpg를 세팅하고 아래 terraform code를 실행한다.
resource "aws_iam_user" "user1" { name = "user1" force_destroy = true } resource "aws_iam_user_login_profile" "user1" { user = "${aws_iam_user.user1.name}" pgp_key = "${base64encode(file("devops-terraform.gpg"))}" password_reset_required = true } output "password" { value = "${aws_iam_user_login_profile.user1.encrypted_password}" }
terraform output password 출력한 것을 base64 decode 하고 gpg 로 풀어서 보면 된다.
$ terraform apply $ terraform output password | base64 --decode | gpg -q --decrypt ; echo