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.


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