DevOps/Automation

[Automation] mysqldump 스크립트 자동화시 계정관리에 관한 경고 → mysql_config_editor

Background


  • terraform과 Ansible로 IaC 구현하는 프로젝트를 진행중 자동화에 관련해서 부딪힌 문제입니다.
  • 현재 init_mysql.sql으로 Database생성과 Table 생성 및 Attribute, Record 생성 그리고 Test Value값을 할당 script를 자동화하기위해 다음과 같은 명령어를 사용중입니다.
  • ${..}의 코드는 Terraform에서 provisioning 단계에서 처리되는 변수값들입니다.

기존 terraform에서의 mysqldump 자동화 Script

$ mysql -u ${aws_db_instance.my_db[count.index].username} -p${var.my_db_password} -h 
$ {aws_db_instance.my_db[count.index].address} < init_mysql.sql"

 

Problem


다음과 같은 insecure 하다는 문구와 함께 terraform의 null_resource가 provisioning 하다가 중단되는 상황이 발생했습니다

(mysql 5.6 이후에서 shell 또는 Command line에서 계정 정보를 그대로 노출하면 다음과 같은 에러가 발생한다고 합니다.)

 

How to do?


mysql_config_editor을 사용하여 로그인 파일을 생성해두고, config file명만 명시하는 형식으로 script의 자동화를 오류 없이 진행할 수 있습니다.

 

Usage

mysql_config_editor사용법은 다음과 같습니다.

 

설정추가

$ mysql_config_editor set --login-path=<configuration name> --host=<hostname> --user=<username> --port=<port number> --password

설정사용

$ mysql_config_editor --login-path=<configuration name>

설정삭제

$ mysql_config_editor remove --login-path=<configuration name> 
$ mysql_config_editor remove --login-path=<configuration name> --user  #설정 중 user 만 삭제 
$ mysql_config_editor reset # 설정 전체 삭제

설정내용확인

mysql_config_editor print --all 
mysql_config_eidtor print --login-path=<configuration name>
  • mysql_config_editor로 계정정보를 만들게 되면 접속한 계정의 home directory에 .mylogin.cnf 이름으로 접속정보가 암호화된 파일이 생성됩니다.
  • .mylogin.cnf는 파일 소유자만 Read-Write할 수 있는 600 권한이어야만 동작합니다. (아닌 경우는 동작 X)
  • Password에 '#'을 포함할 경우 정상적으로 로그인 되지 않습니다.

 

mysql_config_editor을 사용하여 변경된 자동화 script code

$ echo '${var.my_db_password}' | unbuffer -p mysql_config_editor set --login-path=flask --host=${aws_db_instance.my_db[count.index].address} --user=${var.my_db_user} --port=3306 --password
$ mysql --login-path=flask < init_mysql.sql
  • 여기서 CLI interaction을 자동하하기 위해 unbuffer이라는 명령어를 사용하였습니다.
⚠️unbuffer은 expect package를 설치하면 됩니다. (CentOS 기준)

 

다음과 같이 Enter Password:의 상호작용을 skip한 채로 넘어가게 됩니다.

 

mysql_config_editor의 설정내용을 조회하는 명령어는 다음과 같습니다.

$ mysql_config_editor print --all

 

mysql_config_editor의 설정 내용은 home directory에 저장됩니다.

 

ref

unbuffer, expect 관련해서는 조금 더 공부해서 정리 후 올려야겠습니다. :)