문제

문제

문제

Postfix가 MySQL에 대한 TLS 연결을 사용하도록 강제하는 방법을 알 수 없습니다. 나~할 수 있다Postfix 사용자로 TLS를 사용하여 Postfix 서버에서 MySQL 서버로 수동으로 연결하므로 MySQL 인증으로 인해 문제가 발생하지 않습니다. 문제는 분명합니다. Postfix는 MySQL 연결을 위해 TLS를 요청하지 않습니다.

버전:

  • 운영체제: CentOS 7
  • 접미사: 2:2.10.1-6.el7 및 2:3.2.4-1.gf.el7
  • MySQL(MariaDB): 5.5.56

내가 여기까지 어떻게 왔는지

나는 이 질문에 대한 답을 찾기 위해 다양한 StackExchange 사이트를 포함하여 웹 전체를 검색해 왔습니다. 나는 Postfix와 MySQL 문서를 아주 오랫동안 반복해서 읽었습니다. 제가 찾은 가장 좋은 답변은 불필요하게 복잡하다고 거부하는 답변입니다.Postfix와 MySQL 서버 사이에 SSH 터널을 설정한 다음 이를 통해 연결하세요." MySQL 클라이언트에서 TLS(SSL) 암호화를 사용하도록 Postfix에 지시하는 방법이 있어야 합니다.

설정을 살펴보기 전에 다음 회사를 만들어 보겠습니다. 내 메일 서버 설정은 MySQL TLS 없이도 완벽하게 작동합니다.. 나는 SMTPS와 IMAPS에 TLS를 성공적으로 사용하고 있으며내 질문이랑은 상관없어. Postfix와 MySQL 서버 간의 MySQL 연결이 암호화되지 않은 것을 제외하고 메일은 내 네트워크 안팎으로 안전하게 전송되고 있습니다. 노출된 Postfix-MySQL 링크를 제외하면 내 메일 인프라에는 아무런 문제가 없습니다.

그러나 보안 요구 사항의 변화로 인해 모든 MySQL 연결을 암호화하려면 기존 인프라를 업데이트해야 합니다. MySQL 연결을 위한 TLS 설정은 쉬웠습니다. 수동 테스트에 따르면 MySQL 클라이언트는 허용된 모든 호스트에서 TLS 암호화 링크를 통해 성공적으로 연결할 수 있습니다.. 따라서 MySQL TLS 설정도 견고하며 모든 작업에 작동합니다.접미사 제외.

내가 시도한 것

Postfix 서버 관련 구성:

/etc/postfix/main.cf

자료를 최대한 구체적으로 유지하기 위해 여러 연결 중 하나로 축소되었습니다.

virtual_alias_maps = proxy:mysql:/etc/postfix/lookup_aliases.cf
proxy_read_maps = $virtual_alias_maps
/etc/postfix/lookup_aliases.cf

자격 증명과 호스트 이름이 난독화되었습니다.

hosts = mysql-server.domain.tld
user = postfix
password = *****
dbname = mail
option_file = /etc/my.cnf.d/client.cnf
option_group = client
tls_verify_cert = yes
query = SELECT goto FROM alias WHERE address = '%s' AND active = '1'
/etc/my.cnf

이 파일은 그대로 유지됩니다. 나는 다음 구성 파일이 MySQL 클라이언트 구성에 적절하게 포함되어 있음을 보여주기 위해 이를 포함시켰습니다.

!includedir /etc/my.cnf.d
/etc/my.cnf.d/client.cnf
[client]
ssl = true

성공 -- 수동 -- Postfix 사용자로 Postfix 서버에서 MySQL TLS 연결 출력

특히 TLS가 성공적으로 사용되었다는 점에 유의하세요.

# hostname -f
mail.domain.tld

# sudo -u postfix mysql -h mysql-server.domain.tld -u postfix -p mail
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 72
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [mail]> \s
--------------
mysql  Ver 15.1 Distrib 5.5.56-MariaDB, for Linux (x86_64) using readline 5.1

Connection id:     72
Current database:  mail
Current user:      [email protected]
SSL:           Cipher in use is DHE-RSA-AES256-GCM-SHA384
Current pager:     stdout
Using outfile:     ''
Using delimiter:   ;
Server:            MariaDB
Server version:        5.5.56-MariaDB MariaDB Server
Protocol version:  10
Connection:        mysql-server.domain.tld via TCP/IP
Server characterset:   latin1
Db     characterset:   utf8
Client characterset:   utf8
Conn.  characterset:   utf8
TCP port:      3306
Uptime:            1 hour 27 min 23 sec

Threads: 1  Questions: 271  Slow queries: 0  Opens: 13  Flush tables: 2  Open tables: 39  Queries per second avg: 0.051
--------------

MariaDB [mail]> \q
Bye

MySQL 서버의 관련 구성:

MySQL 보조금

TLS(SSL)가 필수이지만 그렇지 않으면 이 TLS 연결 문제를 정리할 때까지 권한이 상대적으로 느슨합니다.

MariaDB [(none)]> SHOW GRANTS FOR 'postfix'@'10.0.101.%';
+-----------------------------------------------------------------------------------------------------+
| Grants for [email protected].%                                                                       |
+-----------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'postfix'@'10.0.101.%' IDENTIFIED BY PASSWORD '*SOMEPASSWORDHASH' REQUIRE SSL |
| GRANT SELECT ON `mail`.* TO 'postfix'@'10.0.101.%'                                                  |
+-----------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

로그

SSL이 필요한 경우 Postfix 연결이 실패함

MySQL TLS 연결의 수동 명령줄 테스트가 여기에서 성공하더라도 Postfix는 여전히 MySQL TLS를 사용하지 않습니다.

MySQL 일반 로그:

180217 14:45:15       16 Connect   [email protected] as anonymous on mail
      16 Connect   Access denied for user 'postfix'@'mail.domain.tld' (using password: YES)

접미사 로그:

Feb 19 19:22:55 mail postfix/cleanup[11951]: warning: proxy:mysql:/etc/postfix/lookup_aliases.cf lookup error for "[email protected]"
Feb 19 19:22:55 mail postfix/cleanup[11951]: warning: E2CCA2069823: virtual_alias_maps map lookup problem for [email protected] -- message not accepted, try again later
REQUIRE SSL이 제거되면 Postfix 연결이 성공합니다.

REQUIRE SSL에서 REQUIRE NONE으로 권한을 변경한 후 Postfix가 성공적으로 연결되었습니다. 그러나 연결은암호화되지 않음.

180217 15:17:21       26 Connect   [email protected] as anonymous on mail
          26 Query show databases
          26 Query show tables
          26 Field List    admin
          26 Field List    alias
          26 Field List    alias_domain
          26 Field List    config
          26 Field List    domain
          26 Field List    domain_admins
          26 Field List    fetchmail
          26 Field List    log
          26 Field List    mailbox
          26 Field List    quota
          26 Field List    quota2
          26 Field List    vacation
          26 Field List    vacation_notification
          26 Query select @@version_comment limit 1

결론

나에게 필요한 것은 Postfix가 ssl = trueMySQL 클라이언트 연결을 존중하는 것뿐입니다. 추가 정보가 필요하면 알려주시기 바랍니다.

업데이트:

이 질문을 게시한 후 Postfix 2.11 이전 버전에서는 MySQL 구성 파일 읽기를 전혀 지원하지 않는다는 사실을 좀 더 자세히 읽어보니 알게 되었습니다. 따라서 공급업체에서 제공하는 Postfix 버전(버전 2.10)에서 MySQL TLS를 사용하도록 구성하는 것은 불가능합니다. 나는 Postfix 문서에서 잘못된 표현 선택을 느꼈습니다.MySQL 구성에 대한 Postfix 문서읽는다:

Postfix 3.1 and earlier don't read [client] option group settings unless a non-empty option_file or option_group value are specified. To enable this, specify, for example "option_group = client".

저자는 다음 내용을 자세히 설명하지 못했습니다.

These options are ignored for Postfix 2.10 and earlier.  Postfix 2.11 through 3.1 don't read [client] option group settings unless a non-empty option_file or option_group value are specified. To enable this, specify, for example "option_group = client".

그래서 공급업체에서 제공한 버전 2.10에서 CentOS 7의 Postfix를GhettoForge Plus 제공버전 3.2. 추가 패키지를 설치했습니다 postfix3-mysql. 나는 큰 기대를 가지고 있었지만 그것은 무너졌습니다. 이제 Postfix 3.2에서도여전히 TLS 링크를 통해 MySQL에 연결되지 않습니다.

option_file = /etc/my.cnf나는 (기본값이고 불필요해야 함) 두 가지를 모두 시도했지만 option_file = /etc/my.cnf.d/client.cnf소용이 없었습니다.

심지어 tls_verify_cert = yes. 이것도 효과가 없었습니다. 인증서 이름이 일치하므로 이 확인이 실제로 시도되면 통과됩니다.

답변1

개요

Postfix에서 MySQL TLS 연결을 설정하려면 다음이 필요합니다.

  1. Postfix 버전 2.11 이상. CentOS 7은 다음과 같은 기능만 제공합니다.포스트픽스 버전 2.10. CentOS가 아닌 수단을 통해 Postfix 업그레이드를 획득해야 합니다. 나는 다음의 postfix3postfix3-mysql패키지를 사용하기로 결정했습니다.게토포지 플러스왜냐하면 그럴 것 같으니까CentOS 커뮤니티에서 추천함.
  2. 세트mysql_table구성 파일 내에서어느 하나:
    1. 최소한 하나의 허용되는 tls_ciphers설정;
    2. 클라이언트 측 TLS 인증서 및 일치하는 개인 키,MySQL 서버와 Postfix 클라이언트 모두에 공통된 인증 기관에서 서명했습니다.; 또는
    3. 둘 다.
  3. /etc/my.cnf 또는 /etc/my.cnf.d/* 파일에 이러한 설정을 의존하지 마십시오! Postfix MySQL 코드는 MySQL TLS 연결 설정 여부를 결정하기 위해 해당 파일을 읽지 않습니다. 너무 늦게 구문 분석됩니다. 그만큼오직Postfix가 MySQL TLS 연결을 열도록 유도하는 방법은 구성 파일 내에 TLS 설정을 지정하는 것입니다 mysql_table. 기간.

내가 여기까지 어떻게 왔는지

나는 마침내 Postfix 3.2 소스 코드를 읽어보기로 했습니다. src/global/dict_mysql.c의 653-658행은 특히 유익했습니다.

마지막 해결책

의 동작을 에뮬레이트하려면 구성 파일 ssl = true에 다음과 유사한 줄을 추가하기만 하면 됩니다 mysql_table.

tls_ciphers = TLSv1.2

우리 구성에서는 TLS 1.2만 사용해야 합니다. 그리고 이미 MySQL 서버 구성에 오랫동안 적용되었기 때문에 클라이언트에도 이를 적용하는 것이 자동으로 발생하지 않았습니다. 하지만 다른 항목을 자유롭게 추가할 수 있습니다. 조직에서 오래된 암호를 허용하는 경우 암호를 사용하세요.

클라이언트 측 인증서를 사용하지 않는 것이 매우 만족스럽습니다. 당사는 데이터베이스 연결을 보호하고 적극적으로 모니터링하기 위해 다른 수단을 사용합니다. 우리는 추가적인 복잡성을 원하지 않습니다.

대체 솔루션

알려진 신뢰할 수 있는 클라이언트만 MySQL 서버에 연결하도록 강제하고 싶다면 엄격한 방화벽, 엄격한 비밀번호 복잡성, 비밀번호 순환 주기, 연결 감사 등과 같은 다른 정책 적용 메커니즘을 통해서는 그렇게 할 수 없습니다. 또한 구성 파일의 다음 추가 설정을 통해 클라이언트 측 인증서를 사용하십시오 mysql_table.

tls_key_file = /path/to/private.key
tls_cert_file = /path/to/public.certificate
tls_CAfile = /path/to/common.CA.certificate # OR tls_CApath = /path/to/CA-and-intermediate-chain-certificates/

다시 한번 /etc/my.cnf 또는 /etc/my.cnf.d/*에 설정하십시오.도움이 되지 않습니다. 이 파일은 다음까지 구문 분석되지 않습니다.~ 후에연결 유형(TLS 또는 비 TLS)이이미 결정됐어.

클라이언트 측 인증서를 사용하기로 선택한 경우,서버에서 시행! 너하지 마라원하는 것이 MySQL 트래픽을 암호화하는 것뿐이라면 클라이언트측 인증서가 필요합니다. 대신 tls_ciphers위의 대안을 사용하세요. 클라이언트 측 인증서를 추가하면 MySQL은 연결 클라이언트가 이미 알려져 있고 신뢰할 수 있지만MySQL에게 그렇게 하는 방법을 알려주는 경우에만! 추측하지 않으며 클라이언트와 서버 사이에 공통 CA가 존재하는지에만 의존하는 것은 이 강력한 도구의 부분적인 구현일 뿐입니다. 이 MySQL 보안 모델에 관심이 있다면 적어도 하나를 찾았습니다.클라이언트 인증서 유효성 검사를 사용하는 방법에 대한 좋은 예를 제공하는 방법 가이드.

관련 정보