Ssl

apache ldap ssl 的 SELinux 上下文

  • May 5, 2019

問題

我需要什麼 SELinux 上下文,什麼文件才能讓 apache ldap(通過 ssl)身份驗證工作?或者它是網路協議或系統呼叫還是完全其他的東西?

環境

Centos 7 上的 Apache 2.4 使用基於 ssl 的基本 ldap 身份驗證。

使用 SELinux permissive ( setenforce 0),一切執行良好。我可以完美地用ldap登錄到受保護的目錄。

啟用 SELinux ( setenforce 1) 後,apache 無法執行 ldap 搜尋並允許使用者通過。它與 ssl 或證書有關,我無法弄清楚。

/var/log/httpd/ssl_error_log

[Thu Mar 17 15:33:32.529755 2016] [authnz_ldap:debug] [pid 6412] mod_authnz_ldap.c(501): [client 158.158.193.232:17386] AH01691: auth_ldap authenticate: using URL ldaps://ldap-ad.example.org:636/ou=Auto-Accounts,dc=example,dc=org?sAMAccountname?sub
[Thu Mar 17 15:33:32.530792 2016] [ldap:debug] [pid 6412] util_ldap.c(372): AH01278: LDAP: Setting referrals to On.
[Thu Mar 17 15:33:32.531845 2016] [ldap:debug] [pid 6412] util_ldap.c(372): AH01278: LDAP: Setting referrals to On.
[Thu Mar 17 15:33:32.532936 2016] [ldap:debug] [pid 6412] util_ldap.c(372): AH01278: LDAP: Setting referrals to On.
[Thu Mar 17 15:33:32.533568 2016] [authnz_ldap:info] [pid 6412] [client 158.158.193.232:17386] AH01695: auth_ldap authenticate: user bgstack15 authentication failed; URI /auth1/ [LDAP: ldap_simple_bind() failed][Can't contact LDAP server]
[Thu Mar 17 15:33:32.533784 2016] [ssl:debug] [pid 6412] ssl_engine_io.c(992): [client 158.158.193.232:17386] AH02001: Connection closed to child 1 with standard shutdown (server sample.example.org:443)

/var/log/audit/audit.log

type=AVC msg=audit(1458243341.951:1234): avc:  denied  { name_connect } for  pid=6428 comm="httpd" dest=636 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:ldap_port_t:s0 tclass=tcp_socket
type=SYSCALL msg=audit(1458243341.951:1234): arch=c000003e syscall=42 success=no exit=-13 a0=12 a1=7f2c0498eab0 a2=10 a3=0 items=0 ppid=6409 pid=6428 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="httpd" exe="/usr/sbin/httpd" subj=system_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(1458243341.952:1235): avc:  denied  { name_connect } for  pid=6428 comm="httpd" dest=636 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:ldap_port_t:s0 tclass=tcp_socket
type=SYSCALL msg=audit(1458243341.952:1235): arch=c000003e syscall=42 success=no exit=-13 a0=12 a1=7f2c0498eab0 a2=10 a3=0 items=0 ppid=6409 pid=6428 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="httpd" exe="/usr/sbin/httpd" subj=system_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(1458243341.952:1236): avc:  denied  { name_connect } for  pid=6428 comm="httpd" dest=636 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:ldap_port_t:s0 tclass=tcp_socket
type=SYSCALL msg=audit(1458243341.952:1236): arch=c000003e syscall=42 success=no exit=-13 a0=12 a1=7f2c0498d580 a2=10 a3=0 items=0 ppid=6409 pid=6428 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="httpd" exe="/usr/sbin/httpd" subj=system_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(1458243341.953:1237): avc:  denied  { name_connect } for  pid=6428 comm="httpd" dest=636 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:ldap_port_t:s0 tclass=tcp_socket
type=SYSCALL msg=audit(1458243341.953:1237): arch=c000003e syscall=42 success=no exit=-13 a0=12 a1=7f2c0498d580 a2=10 a3=0 items=0 ppid=6409 pid=6428 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="httpd" exe="/usr/sbin/httpd" subj=system_u:system_r:httpd_t:s0 key=(null)

我已經嘗試過的

我已經開始閱讀 SELinux 並嘗試從其他證書中複製上下文。我嘗試在 /etc/openldap/certs 和 /etc/pki/tls/certs 中的證書上這樣做。也許我需要為 tcp 埠 636 嘗試一些東西?

更新

SElinux:允許 httpd 連接到特定埠提供了一種可行的解決方案,但尚未針對最大安全性進行改進。命令

setsebool httpd_can_network_connect on

允許 httpd 執行 ldaps 綁定。但是,這會過多地打開 httpd,所以我仍在尋找一種只允許埠 636 的方法。

總是有布爾值httpd_can_connect_ldap

這允許:

# sesearch -b httpd_can_connect_ldap -AC
Found 1 semantic av rules:
DT allow httpd_t ldap_port_t : tcp_socket name_connect ; [ httpd_can_connect_ldap ]

ldap_port_t提供對相關埠的訪問:

# semanage port -l
ldap_port_t                    tcp      389, 636, 3268, 7389
ldap_port_t                    udp      389, 636

引用自:https://serverfault.com/questions/764441