Puppet에서 비밀번호 변수 (이 경우 MySQL 비밀번호)를 어떻게 보호합니까?


13

Puppet을 사용하여 매개 변수가있는 클래스로 MySQL을 프로비저닝하고 있습니다.

class mysql::server( $password ) {

        package { 'mysql-server': ensure => installed }
        package { 'mysql': ensure => installed }

        service { 'mysqld':
                enable => true,
                ensure => running,
                require => Package['mysql-server'],
        }

        exec { 'set-mysql-password':
                unless => "mysqladmin -uroot -p$password status",
                path => ['/bin', '/usr/bin'],
                command => "mysqladmin -uroot password $password",
                require => Service['mysqld'],
        }
}

어떻게 보호 할 수 $password있습니까? 현재 노드 정의 파일에서 기본 세계 읽기 가능 권한을 제거하고 puppetACL을 통해 명시 적으로 읽기 권한을 부여했습니다.

나는 다른 사람들이 비슷한 상황을 겪었다 고 가정하고 더 나은 연습이있을 수 있습니다.

답변:


3

Puppet 및 MySQL로 작업 할 때 루트 암호를 /root/.my.cnf에 넣고이 파일을 잠근 다음 SSH 액세스를 데이터베이스 서버로 제한하는 경향이 있습니다.

예, 일반 텍스트로 DB 서버에 루트 비밀번호를 저장하는 것이 가장 안전한 솔루션이 아닙니다. 그러나이 파일에 mysql 루트 비밀번호를 쓰는 경우, 로컬 호스트에서만 로그인 할 수 있도록 mysql 루트 계정을 보호하면 비밀번호는 꼭두각시와 프로세스 목록 ps테이블 에도 유지되지 않습니다 .

또한 누군가가 /root/.my.cnf에서 파일을 읽을 수있는 루트 액세스 권한이있는 경우 로컬 MySQL 데몬을 중지하고 users 테이블없이 데몬을 다시 시작하여 데이터베이스에 즉시 액세스 할 수 있습니다.


2
mysql 5.6 이상에있는 경우 mysql_config_editor를 사용하십시오. 그런 다음 최소한 비밀번호는 일반 텍스트가 아닙니다.
Kejau Touray 2016 년

1

다른 누군가가 나를 고치는 플러그인 또는 유사한 것을 지적 할 수는 있지만 일반적인 텍스트 암호가 아닌 암호화 된 암호 를 저장하는 것이 일반적인 방법 입니다.

그러나 지금 당장 말할 수 있습니다 .MySQL에서는 암호화 된 암호를 사용할 수 없습니다. 그렇지 않으면 WOULD는 암호이며 해시는 로그인 할 수 있습니다.

Hiera 및 GPG 와 같은 타사 유틸리티를 사용할 수있는 많은 "해킹"이 있습니다 . 분명히, 당신은 당신 자신을 굴릴 수 있지만 심지어 Puppet 자신의 메일 링리스트에서도이 방법을 제안합니다 .


1

이 비밀번호를 보호 할 사람을 지정하지 않았습니다. 꼭두각시 마스터 및 / 또는 클라이언트 상자에 액세스 할 수 있지만 루트 암호를 알 필요는없는 다른 sysadmins 또는 개발자라고 가정하겠습니다.

처음에 비밀번호를 설정하려면 다음 구문을 사용할 수 있습니다.

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*6DF1FC54F0CCD999F55D59D3D88526878230C77C' WITH GRANT OPTION;

그러면 일반 텍스트 암호 대신 퍼펫 구성에 암호화 된 암호를 저장할 수 있습니다.

커맨드 라인 mysqladmin에서 mysql클라이언트 를 사용하기 위해서는 내가 생각할 수있는 최선의 방법은 .my.cnf적절한 사용자의 홈 디렉토리에 배치되는 퍼펫 구성에 파일을 추가하는 것입니다 . 퍼펫 마스터와 클라이언트 모두에있는 파일에는 적절하고 제한적인 파일 권한이 있어야합니다.

퍼펫을 믹스에 추가 할 때 (예 : 클라이언트에서 파일을 가져 오는 exec () 작성) 파일 권한과 관련하여 여러 가지 방법이 있지만 암호를 세계에서 읽을 수있는 파일에 저장하는 것보다 개선 된 것으로 보입니다. 퍼펫 구성에 버전 관리 시스템을 사용하는 경우 더 어려울 수 있습니다.


1
그러나 누군가 암호화 된 비밀번호를 검색 한 경우 암호화 된 문자열을 사용하여 로그인 할 수 없었습니까?
Andrew M.

@Redmumba 내 모든 테스트가 그렇게 나타내는 것 같습니다. 아마도 나는 Ladadadada가 정교하게 만들 수있는 것을 놓치고 있습니다.
Belmin Fernandez

3
아니요. MySQL IDENTIFIED BY PASSWORD '*HASH-HERE'대신 사용 IDENTIFIED BY 'PASSWORD-HERE'하면 해시가 user테이블에 직접 삽입됩니다 . 그런 다음 해시를 생성 한 비밀번호를 사용하여 로그인해야합니다 SHOW GRANTS;. 정상적으로 로그인하고을 입력하여 비밀번호 해시가있는 grant 명령이 어떻게 표시되는지 확인할 수 있습니다 . SHOW GRANTS FOR user@host;
Ladadadada

아, 그래서 당신은 로그인을 위해 해시 자체를 사용할 수 없습니다. 그러나 데이터베이스에 연결해야하는 클라이언트 (예 : 프런트 엔드)가있는 경우 암호화 된 암호를 저장하는 방법도 필요합니다.
Andrew M.

0

이 링크 는 환경 변수 사용과 서브 쉘 사용이라는 두 가지 방법을 제안합니다.

명령 주위에 간단한 래퍼를 만들고 mysqladmin암호화 된 암호를 전달할 수도 있다고 생각 합니다. 이 래퍼는 암호를 해독하여에 전달합니다 mysqladmin. 암호 해독 부분이 포함 된 래퍼를 보호해야합니다.

환경과 시스템에 액세스 할 수있는 사람에 따라보다 안전하다고 느끼는 방식을 선택할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.