素のGitでBASIC認証（LDAP）を利用する


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 が必要。