APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

【Terraform】パスワードをハードコーディンせずに記述する方法と解説

目次

はじめに

こんにちは、クラウド事業部の清水(駿)です。

AWSのインフラ構築時にIaCとしてTerraformを採用している現場が近年増えていると感じております。私自身も直近の現場で携わっておりました。
Terraformの公式サイトに沿って記述できるところも多いのですがRDSなどパスワード設定が絡む記述に関しては注意が必要です。
平文のままで記載するのは簡単ですがセキュリティとしてはアンチパターンになってしまいます。
本ブログではパスワードをハードコーディンせずにコード記述する方法について解説して参ります。


こんな方へおすすめの記事です

  • Terraformについて学習されている方
  • Terraformでのパスワード記述について調査している方

平文で記載したアンチパターン

RDS作成時をモデルにします。
個人的な検証ならば問題ないのですが実際の環境でこのように平文で記載してしまうとまずいですね。。。

resource "aws_db_instance" "default" {
  allocated_storage      = 20
  identifier             = var.identifier
  db_name                = var.databasename
  engine                 = "mysql"
  engine_version         = "8.0.32"
  instance_class         = "db.t3.micro"
  username               = "admin"
  password               = "admin01234" ★パスワードが平文で記載されてしまっている
  skip_final_snapshot    = true
  publicly_accessible    = false
  vpc_security_group_ids = [aws_security_group.db.id]
  db_subnet_group_name   = aws_db_subnet_group.db.0.name
}

解決方法

ランダムパスワードの生成

RDS作成前にパスワード用に使用するSecrets Mnagerを作成します。
その際にaws_secretsmanager_random_passwordを記述してください。
オプションは選択可能なのでそれぞれの要件に従ってお好みのものをチョイスしてください。

data "aws_secretsmanager_random_password" "test" { 
password_length = 20  ★パスワードの長さ
exclude_numbers = false ★パスワードから数字を除外するかどうかを指定
exclude_punctuation = true  ★パスワードから次の句読点文字を除外するかどうかを指定→【! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~ .】
include_space = false  ★スペース文字を含めるかどうかを指定
}

生成したパスワードをローカル変数に格納

上記で作成したランダムパスワードをRDSコードに記述する。 ※今回はブログ用でローカル格納としました。実際にコード記述をするときはメンバーと相談して決めていくことになると思います。

locals {
  passwddata = data.aws_secretsmanager_random_password.test.random_secrets
}

resource "aws_db_instance" "default" {
  allocated_storage      = 20
  identifier             = var.identifier
  db_name                = var.databasename
  engine                 = "mysql"
  engine_version         = "8.0.32"
  instance_class         = "db.t3.micro"
  username               = "admin"
  password               = local.passwddata  ★random passwordを代入
  skip_final_snapshot    = true
  publicly_accessible    = false
  vpc_security_group_ids = [aws_security_group.db.id]
  db_subnet_group_name   = aws_db_subnet_group.db.0.name
}

注意点

tfファイルにはパスワードは表示されませんがtfstateファイルにはパスワードがどうしても残ってしまいます。
そのため、S3に格納してtfstateファイルの管理を部外者が操作できなくするなど厳重な対応が必要となります。

参考資料

docs.aws.amazon.com

おわりに

私自身もTerraform触りたての頃にパスワード問題にぶつかりました。以外にもTerraformは困りごとを解決してくれる機能が豊富にあったため平文問題は乗り越えられました。
今回はAWS Prescriptive Guidanceに沿って解説しました。
Terraformはまずは試して実際に結果を確認することでスキルアップできると思うので少しでも皆様の参考になれば幸いです!

お知らせ

APCはAWS Advanced Tier Services(アドバンストティアサービスパートナー)認定を受けております。

その中で私達クラウド事業部はAWSなどのクラウド技術を活用したSI/SESのご支援をしております。
www.ap-com.co.jp

https://www.ap-com.co.jp/service/utilize-aws/

また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。

www.ap-com.co.jp