본문 바로가기
DB

ProxySQL - 비밀번호 관리

by 세계정보ㄱ 2023. 1. 26.
728x90
반응형

MySQL Passwords in ProxySQL

 

ProxySQL은 프로토콜 인식 프록시입니다. ProxySQL은 트래픽을 기반으로 라우팅을 수행하기 때문에 클라이언트가 연결할 때 아직 대상 HG를 식별할 수 없으므로 ProxySQL이 클라이언트를 인증해야 합니다.이러한 이유로 사용자의 비밀번호와 관련된 정보, 즉 인증을 허용하기에 충분한 정보가 필요합니다.

 

또한 ProxySQL은 나중에 백엔드에 대한 연결을 설정하거나 CHANGE_USER이미 설정된 연결 내에서 발행하기 위해 이 정보가 필요합니다.

 

3계층 구성 아키텍처는 사용자 정보에도 적용됩니다.


ProxySQL은 mysql_users테이블에 사용자 정보를 저장합니다.

  • 개체 MySQL_Authentication()는 런타임에 이 정보를 저장할 책임이 있습니다.
  • main. mysql_users메모리 내 데이터베이스입니다.
  • disk. mysql_users온디스크 데이터베이스입니다.

mysql_users 테이블, 인-메모리 및 온-디스크에서 자격 증명은 열 username및 password에 저장됩니다.

 

비밀번호 형식

비밀번호는 2가지 형식으로 저장할 수 있습니다 mysql_users. password, 메모리 내 또는 디스크에 상관없이:

  • 일반 텍스트
  • 해시된 암호

일반 텍스트로 된 암호는 그만큼 간단하고 읽기가 매우 쉽습니다. 데이터베이스 및 구성 파일이 안전한 위치에 보관되어 있으면 보안 문제가 제한적이지만 여전히 존재합니다. 해시된 암호는 mysql.user.password 열에 저장된 것과 동일한 형식의 MySQL 서버 암호를 가집니다.

 

ProxySQL 은 * 로 시작하는 암호를 hashed password 로 고려합니다.

 

해시된 암호 및 인증

MySQL 및 ProxySQL에서 해시된 비밀번호는 SHA1(SHA1('clear_password')). 해시된 비밀번호에서 일반 텍스트 비밀번호를 추출하는 것은 불가능합니다.
클라이언트가 ProxySQL에 연결할 때 해시된 암호를 사용하여 인증할 수 있습니다.
첫 번째 클라이언트 인증 중에 ProxySQL은 부분적으로 해시된 암호를 도출할 수 있습니다 SHA1('clear_password'). 이 정보는 런타임에 내부적으로 저장되며 ProxySQL이 백엔드에 연결할 수 있도록 합니다.

 

새 비밀번호 입력 방법

ProxySQL의 Admin 인터페이스에는 PASSWORD()기능이 없습니다. 이는 다음을 의미합니다.

  • 암호는 삽입된 형식(일반 텍스트 또는 해시)으로 저장됩니다.
  • Admin 인터페이스에 비밀번호를 입력하는 동안 일반 텍스트 비밀번호에서 해시된 비밀번호를 파생시킬 수 없습니다(그러나 MySQL 서버에서 SELECT PASSWORD('password') 실행하고 결과를 복사하여 붙여넣을 수 있음).

변하기 쉬운admin-hash_passwords

해시된 암호 지원을 용이하게 하기 위해 ProxySQL v1.2.3에서는 admin-hash_passwords기본적으로 활성화된 새로운 전역 부울 변수 를 도입했습니다.

admin-hash_passwords=true 암호는 LOAD MYSQL USERS TO RUNTIME 실행 중일 때만 RUNTIME에 자동으로 해시됩니다.
테이블의 암호 mysql_users는 아직 자동으로 해시 되지 않습니다. 그럼에도 불구하고 메모리 내와 디스크 모두에서 mysql_users 테이블의 암호를 쉽게 해시할 수 있습니다. RUNTIME 에서 사용자를 복사하는 것으로 충분합니다. LOAD MYSQL USERS TO RUNTIME 실행 이후 SAVE MYSQL USERS FROM RUNTIME 실행한 후에 SAVE MYSQL USERS TO DISK 실행합니다.

 

예를 들면 다음과 같습니다.

Admin> SELECT * FROM mysql_users;
Empty set (0.00 sec)

Admin> INSERT INTO mysql_users(username,password) VALUES ('user1','password1'), ('user2','password2');
Query OK, 2 rows affected (0.00 sec)

Admin> SELECT username,password FROM mysql_users;
+----------+-----------+
| username | password  |
+----------+-----------+
| user1    | password1 |
| user2    | password2 |
+----------+-----------+
2 rows in set (0.00 sec)

Admin> LOAD MYSQL USERS TO RUNTIME;
Query OK, 0 rows affected (0.00 sec)

Admin> SELECT username,password FROM mysql_users;
+----------+-----------+
| username | password  |
+----------+-----------+
| user1    | password1 |
| user2    | password2 |
+----------+-----------+
2 rows in set (0.00 sec)

이 단계에서 암호는 런타임에 해시되지만 mysql_users 에는 여전히 해시되지 않습니다. mysql_users에서 그것들을 해시하려면 :

Admin> SAVE MYSQL USERS FROM RUNTIME;
Query OK, 0 rows affected (0.00 sec)

Admin> SELECT username,password FROM mysql_users;
+----------+-------------------------------------------+
| username | password                                  |
+----------+-------------------------------------------+
| user1    | *668425423DB5193AF921380129F465A6425216D0 |
| user2    | *DC52755F3C09F5923046BD42AFA76BD1D80DF2E9 |
+----------+-------------------------------------------+
2 rows in set (0.00 sec)

이제 해시된 암호를 SAVE MYSQL USERS TO DISK 실행하여 디스크에 저장할 수 있습니다.

 

참고 : 변수 admin-hash_passwords가 admin- 변수가 아니라 mysql- 변수입니다. 이는 Admin의 동작에 영향을 미치기 때문입니다. admin-hash_passwords 에서 변경 사항을 적용하려면 LOAD MYSQL VARIABLES TO RUNTIME가 아니라 LOAD ADMIN VARIABLES TO RUNTIME 를 실행해야 하므로 이 세부 정보가 중요합니다 . 

728x90
반응형

'DB' 카테고리의 다른 글

ProxySQL - 사용자 구성  (0) 2023.01.26
ProxySQL - Query Logging  (0) 2023.01.19
ProxySQL - Query Cache  (0) 2023.01.19
ProxySQL - Sharding  (0) 2023.01.19
ProxySQL - 읽기/쓰기 분할 설정 방법  (0) 2023.01.19