Gitサーバを構築することになったのだが、要望としてLDAPに登録したユーザーで認証したい、ということだった。
ネット上にはあまり詳しい情報がなかったのでメモを残しておく。
今回はGitのフロントにhttpdを配置し、mod_ldapで認証をすることにした。
httpd, git共にパッケージマネージャーからインストールしたものを使用した。
環境情報
# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built: Nov 14 2016 18:04:44
# git version
git version 1.8.3.1
必要なパッケージのインストール
# yum install httpd mod_ldap git
Apache設定の追加
# vim /etc/httpd/conf.d/git.conf
SetEnv GIT_PROJECT_ROOT /var/lib/git
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/
<Files "git-http-backend">
AuthType Basic
AuthName "Git Access"
AuthLDAPBindDN example@example.local
AuthLDAPBindPassword 1000000000
AuthLDAPUrl "ldap://192.168.1.20:389/OU=01.example,DC=example,DC=local?sAMAccountName?sub?(objectClass=user)"
AuthLDAPBindAuthoritative off
AuthBasicProvider ldap
AuthLDAPGroupAttribute "member"
AuthLDAPSubGroupClass "group"
AuthLDAPSubGroupAttribute member
AuthLDAPGroupAttributeIsDN on
AuthLDAPMaxSubGroupDepth 10
Require valid-user
</Files>
※LDAPサーバの設定は環境によって異なるので適宜読み替える必要がある。
中央リポジトリの作成
# cd /var/lib/git
# git init --bare --shared sandbox.git
# cd sandbox.git
# git update-server-info
# mv hooks/post-update.sample hooks/post-update
# chown -R apache.apache /var/lib/git
トラブルシューティング
ApacheからLDAPサーバに接続できない
上記の設定を反映すると、認証ダイアログが表示されるようになる。
正しい情報を入力してもログインエラーになるので原因を調べたらSELINUXによってLDAPサーバへのアクセスがブロックされていた。
# less /var/log/audit/audit.log
type=AVC msg=audit(1517891103.877:367): avc: denied { name_connect } for pid=2981 comm="httpd" dest=389 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:ldap_port_t:s0 tclass=tcp_socket
type=SYSCALL msg=audit(1517891103.877:367): arch=c000003e syscall=42 success=no exit=-13 a0=13 a1=7f49b83bd8c0 a2=10 a3=0 items=0 ppid=2975 pid=2981 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)
要は、httpd_tからldap_port_tへ接続する際に適用されるSELINUXのポリシーを確認すると、
# sesearch -A -C -s httpd_t -t ldap_port_t -c tcp_socket
Found 7 semantic av rules:
allow httpd_t port_type : tcp_socket { recv_msg send_msg } ;
DT allow httpd_t port_type : tcp_socket name_connect ; [ httpd_can_network_connect ]
DT allow nsswitch_domain ldap_port_t : tcp_socket name_connect ; [ authlogin_nsswitch_use_ldap ]
DT allow nsswitch_domain ldap_port_t : tcp_socket { recv_msg send_msg } ; [ authlogin_nsswitch_use_ldap ]
DT allow nsswitch_domain port_type : tcp_socket { recv_msg send_msg } ; [ nis_enabled ]
DT allow httpd_t ldap_port_t : tcp_socket name_connect ; [ httpd_can_connect_ldap ]
DT allow nsswitch_domain reserved_port_type : tcp_socket name_connect ; [ nis_enabled ]
下から2番目、httpd_can_connect_ldapで拒否されている。
# setsebool -P httpd_can_connect_ldap on
# sesearch -A -C -s httpd_t -t ldap_port_t -c tcp_socket
Found 7 semantic av rules:
allow httpd_t port_type : tcp_socket { recv_msg send_msg } ;
DT allow httpd_t port_type : tcp_socket name_connect ; [ httpd_can_network_connect ]
DT allow nsswitch_domain ldap_port_t : tcp_socket name_connect ; [ authlogin_nsswitch_use_ldap ]
DT allow nsswitch_domain ldap_port_t : tcp_socket { recv_msg send_msg } ; [ authlogin_nsswitch_use_ldap ]
DT allow nsswitch_domain port_type : tcp_socket { recv_msg send_msg } ; [ nis_enabled ]
ET allow httpd_t ldap_port_t : tcp_socket name_connect ; [ httpd_can_connect_ldap ]
DT allow nsswitch_domain reserved_port_type : tcp_socket name_connect ; [ nis_enabled ]
setseboolコマンドでセキュリティポリシーを変更すると問題なく接続出来た。
※環境によっては yum install setools-console が必要。