Postfix: làm thế nào để sử dụng tập tin đơn giản để xác thực SASL?


8

Tôi muốn chạy Postfix trên Debian Debian để gửi e-mail từ ứng dụng của tôi. Ứng dụng (chạy trên các VPS khác) sẽ kết nối với Postfix qua SMTP. Postfix không phải xử lý email đến; nó chỉ là về việc gửi tin nhắn đi.

Để ngăn chặn việc chuyển tiếp mở, nên sử dụng xác thực SASL. Tuy nhiên, tôi không muốn chạy Dovecot hoặc MySQL để xác thực SASL.

Làm cách nào tôi có thể thiết lập xác thực SASL bằng một tệp đơn giản (chứa tên người dùng và mật khẩu)?

Tôi đã tìm thấy một câu hỏi tương tự ; Tuy nhiên, không có câu trả lời thỏa mãn ở đó.


Sử dụng tường lửa để chỉ cho phép các địa chỉ IP của VPS khác kết nối. Ngoài ra, bạn có thể đặt biến mynetworks trong main.cf để nhận biết hậu tố về điều đó, ngay cả khi tường lửa bị lỗi. Nếu bạn thực sự muốn SASL, hãy đọc SASL_README đi kèm với postfix và thiết lập SASL để sử dụng / etc / sasldb làm "cơ sở dữ liệu". Nên làm việc ra khỏi hộp. saslpasswd thêm / xóa / thay đổi tập tin.
AndreasM

Câu trả lời:


14

Postfix hiện chỉ hỗ trợ hai phương thức xác thực SASL. Một trong số đó là Dovecot, thứ mà bạn không muốn. Cái còn lại là Cyrus, gần với những gì bạn muốn có thể nhận được mà không cần viết lại Postfix. Nó liên quan đến việc chạy một daemon xác thực ( saslauthd) riêng biệt , nhưng tệp xác thực rất dễ chỉnh sửa và cập nhật.

Những điều cơ bản để sử dụng Cyrus SASL có thể được tìm thấy tại trang web tài liệu postfix , nhưng đây là một mô tả ngắn. Vui lòng nhìn vào liên kết nếu có bất cứ điều gì khó hiểu!

Bắt đầu bằng cách cài đặt Cyrus SASL với plugin sasldb. . thêm postfix vào nhóm SASL và đảm bảo rằng nhóm đó đã đọc và thực thi các quyền đối với thư mục /var/run/saslauthd.

Cấu hình SASL

Định cấu hình SASL để sử dụng sasldb bằng cách chỉnh sửa /etc/sasl2/smtpd.conf:

pwcheck_method: auxprop
auxprop_plugin: sasldb
mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5 NTLM

Plugin sasldb có nghĩa là sasl sẽ sử dụng tệp Berkeley DB cho tên người dùng và mật khẩu. Bạn thêm người dùng bằng lệnh saslpasswd2:

$ saslpasswd2 -c -u example.com username
Password:
Again (for verification):

Lưu ý rằng bạn chỉ định một tên miền cùng với tên người dùng và người dùng sẽ cần sử dụng "username@example.com" thay vì chỉ "tên người dùng" khi xác thực.

Bạn có thể xác minh những gì người dùng đã được nhập bằng cách chạy sasldblistusers2.

Bắt đầu saslauthd và xác minh rằng xác thực hoạt động bằng cách thực hiện

testsaslauthd -u username@example.com -p password

Cấu hình Postfix

Khi đã xong, hãy báo cho Postfix sử dụng SASL và nói với Cyrus rằng đó là SMTP đang xác thực, bằng cách chỉnh sửa /etc/postfix/main.cf để chứa

smtpd_sasl_auth_enable = yes
smtpd_sasl_path = smtpd

Sau đó, tải lại postfix và bạn sẽ được đặt.


Cảm ơn câu trả lời sâu rộng của bạn! Tôi đã làm theo tất cả các bước và mọi thứ dường như hoạt động tốt. sasldblistusers2xuất ra chính xác danh sách người dùng tôi đã thêm. Tuy nhiên, khi thực hiện testsaslauthd, tôi nhận được kết quả này : 0: NO "authentication failed". Bạn có biết làm thế nào tôi có thể sửa nó? Đây là từ của tôi /var/log/auth.log:saslauthd[30471]: do_auth : auth failure: [user=XXX@XXX] [service=smtpd] [realm=] [mech=pam] [reason=PAM auth error]
Jonathan

Điều đó có nghĩa là saslauthd đang cố gắng sử dụng PAM thay vì sasldb. Dòng lệnh được sử dụng để bắt đầu nó là gì?
Jenny D

Tôi đã sử dụng testsaslauthd (như được mô tả trong câu trả lời ban đầu của bạn), và cũng đã thử nối thêm -s smtpdnó. Nếu tôi đặt MECHANISMS="sasldb"trong /etc/default/saslauthdvà saslauthd khởi động lại, tôi nhận được kết quả tương tự từ testsaslauthd. Nhật ký xác thực hiển thị một thông báo khác:saslauthd[3706]: do_auth : auth failure: [user=XXX@XXX] [service=smtpd] [realm=] [mech=sasldb] [reason=Unknown]
Jonathan

2
Hừm, testsaslauthd đang hoạt động nếu tôi chỉ định riêng tên người dùng và phần tên miền, như thế này: testsaslauthd -u username -r example.com -p XXXtrả về 0: OK "Success.". Bây giờ tôi sẽ kiểm tra xem Postfix có thể hoạt động xung quanh điều này hay không
Jonathan

Nếu bạn sử dụng, -s smtpdbạn sẽ làm cho nó sử dụng PAM thay vì sasldb, vì vậy đừng làm điều đó ...
Jenny D

1

Để ngăn chặn việc chuyển tiếp mở, nên sử dụng xác thực SASL.

SASL chỉ là một trong nhiều cách để ngăn chặn điều này. Một cách khác là liệt kê danh sách IP bạn sử dụng trên các VPS khác hoặc yêu cầu chứng chỉ ứng dụng khách TLS (đây có thể nói là cách an toàn nhất.)

Chỉ cần thiết lập một CA ký trên máy postfix và ký một chứng chỉ cho mỗi VPS bạn muốn gửi email.
Sau đó yêu cầu xác minh chứng chỉ khách hàng đầy đủ cho tất cả các thư đã gửi; vô hiệu hóa bất kỳ phương pháp trình khác.

Những gì bạn yêu cầu là không thể, vì postfix không hỗ trợ trực tiếp cho SASL.


1

Chỉ cần làm rõ một vài điều,

Tạo một tài khoản trong sasldb:

% saslpasswd2 -c -u fqdn username

Kiểm tra xác thực:

% testsaslauthd -u username -p password

(lưu ý: tên người dùng không được theo sau bởi fqdn)

Tôi cũng muốn thêm rằng việc tạo tài khoản root

% saslpasswd2 -c -u example.com root

sẽ không để bạn xác thực

% testsaslauthd -u root -p some_password
0: NO "authentication failed"

Nhưng đây không phải là một lỗi. Nó chỉ là một tính năng an toàn.


0

Nếu bạn không cần xử lý thư đến, thì đừng bận tâm với xác thực. Chỉ cần chặn lưu lượng truy cập đến bằng tường lửa và / hoặc giới hạn nó chỉ với localhost.

 inet_interfaces = 127.0.0.1

Không còn vấn đề chuyển tiếp mở, và bạn cũng tránh làm phức tạp mọi thứ cho các ứng dụng cần gửi thư qua postfix.


Cảm ơn câu trả lời. Ứng dụng đang chạy trên các VPS khác, vì vậy Postfix sẽ nhận được email từ các máy chủ khác ngoài localhost.
Jonathan

Bạn có thể xác định IP của các kết nối dự kiến ​​và liệt kê chúng trong cấu hình postfix hoặc cấu hình tường lửa không? Ví dụ: tất cả chúng có thể nằm trong một khối mạng đơn hoặc một nhóm IP hoặc khối đủ nhỏ để bạn có thể dễ dàng liệt kê chúng. Ngoài ra, bạn có thể xem xét việc sử dụng một mạng riêng giữa các máy chủ ảo của mình.
mc0e
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.