2011年1月18日火曜日

Squid AD認証

どうも、Cです。

今日はSquidをActiveDirectory認証させてしまう。(透過的に)
何がしたいかというと。

セキュリティ対策などでsquidを導入したけど
ログに残るのはアクセス元IPアドレスなのでPC単位での特定しかできない。
squidアクセス時にベーシック認証をユーザにさせればログに出せるけど、透過的じゃ無いし、
使ってる人へ、「入力してください」って通知しなきゃいけないし。いやだ

せっかくAD環境で認証させているんだったら、ログにユーザ名を出したい。

1、Squidの動いているLinuxをADのドメインに参加させる。
 
・samba3.5.6をソースからコンパイルしてインストールします
ADがWindowsServer2008なのでsamba3.0系では参加できなさそう。(3.2からいけるみたい)
#cd /usr/src
#wget http://www.samba.org/samba/ftp/stable/samba-3.5.6.tar.gz
#chown -R root:root samba-3.5.6
#cat samba-3.5.6/packaging/RHEL/samba.spec | grep BuildRequir
BuildRequires: pam-devel, readline-devel, fileutils, libacl-devel, openldap-devel, krb5-devel, cups-devel, keyutils-devel
↑sambaをコンパイルするのにこれだけの開発パッケージ入れといてねっていうこと

#rpm -qa |grep -e pam-devel -e readline-devel -e fileutils -e libacl-devel -e openldap-devel -e krb5-devel -e cups-devel -e keyutils-libs-devel make
↑必要なパッケージが入っているのか確認
結果:どれも入っていない

#yum install -y pam-devel readline-devel fileutils libacl-devel openldap-devel krb5-devel cups-devel keyutils-lib-devel make
↑どばっとインストール

#rpm -qa |grep -e pam-devel -e readline-devel -e fileutils -e libacl-devel -e openldap-devel -e krb5-devel -e cups-devel -e keyutils-libs-devel makecups-devel keyutils-lib-devel make
readline-devel-5.1-3.el5
cups-devel-1.3.7-18.el5_5.8
keyutils-libs-devel-1.2-1.el5
libacl-devel-2.2.39-6.el5
krb5-devel-1.6.1-36.el5_5.6
openldap-devel-2.3.43-12.el5_5.3
pam-devel-0.99.6.2-6.el5_5.2
make-3.81-3.el5
↑fileutilsが見当たらないが、CentOSはcoreutilsに含まれていてインストールのときに自動的に
入っていた。気が利く

#cd samba-3.5.6/source3
#./configure CC="gcc" CFLAGS="-O2 -march=pentium3" --prefix=/usr/local --localstatedir=/var --with-configdir=/etc/samba --with-modulesdir=/usr/local/lib/samba --with-pammodulesdir=/lib/security --with-lockdir=/var/lib/samba --with-logfilebase=/var/log/samba --with-piddir=/var/run --with-swatdir=/usr/local/share/swat --with-shared-modules=idmap_ad,idmap_rid,idmap_adex,idmap_hash,idmap_tdb2 --with-acl-support --with-ads --with-automount --with-cifsumount --with-cifsupcall --with-cluster-support=auto --with-dnsupdate --with-fhs --with-libsmbclient --with-libsmbsharemodes --with-libtalloc --with-libtdb --with-pam --with-pam_smbpass --with-quotas --with-sendfile-support --with-syslog --with-utmp --with-winbind

#make showlayout ←念のため確認
prefix: /usr/local
bindir: /usr/local/bin
sbindir: /usr/local/sbin
libdir: /usr/local/lib
modulesdir: /usr/local/lib/samba
vardir: /var
mandir: /usr/local/share/man
privatedir: /etc/samba/private
configdir: /etc/samba
lockdir: /var/lib/samba
statedir: /var/lib/samba
cachedir: /var/lib/samba
piddir: /var/run
swatdir: /usr/local/share/swat
datadir: /usr/local/share
codepagedir: /usr/local/lib/samba

#make

#make install
#cd ../packaging/RHEL/setup
#cp samba.log /etc/logrotate.d/samba
#cp samba.pamd /etc/pam.d/samba
#cp samba.sysconfig /etc/sysconfig/samba
#cp {smb.conf,smbprint,smbusers} /etc/samba/
#cp smb.init /etc/rc.d/init.d/smb
#cp swat /etc/xinetd.d
#cp winbind.init /etc/rc.d/init.d/winbind
#chmod 755 /etc/init.d/smb /etc/init.d/winbind
↑起動ファイルとかのコピーとか

#cd ~
#echo /usr/local/lib >> /etc/ld.so.conf.d/usrlocal.conf
#ldconfig
#ldconfig -p | grep smb

#vi /etc/resolv.conf
search domain.local.co.jp ←ドメインをsearchで書いておく
nameserver 192.168.1.100 ←AD兼DNS
#vi /etc/hosts
127.0.0.1 PROXY-01

#vi /etc/samba/smb.conf
workgroup = DOMAIN
server string = PROXY-01
security = ads
hosts allow = 192.168.1. 127.
realm = DOMAIN.LOCAL.CO.JP ←絶対大文字だから
idmap uid = 10000-11000
idmap gid = 10000-11000
↑sambaのグローバル設定

#LANG=en_US ←ジャパン語ロケールだとauthconfigがうまくできないことがあるよ
#authconfig --enablewinbind --update
# authconfig --krb5kdc=192.168.1.100 --krb5realm=DOMAIN.LOCAL.CO.JP --update
↑/etc/nsswitch.conf と /etc/krb5.conf の設定をしてくれる、別に手動でやってもいいけど

#/etc/init.d/smb status
#/etc/init.d/winbind status
↑サービスが停止していることを確認する! 動いてたらAD参加でおかしなことになるぞ!

#net ads join -U Administrator ←ドメインで参加許可の権限のあるアカウントを指定
Enter Administrator's password:
Using short domain name -- DOMAIN
Joined 'PROXY-01' to realm 'domain.local.co.jp'
No DNS domain configured for proxy-01. Unable to perform DNS Update.
DNS update failed!

↑これで無事にドメインに参加できた。
DNSで自分自身のFQDNの名前が解決できないと怒っているが、
sambaのDNS動的更新機能が有効になっているからだから、問題無し。

Windows Server の ユーザとコンピュータのところにプロキシが追加されていればOK
DNSの前方向と逆方向を登録しておこう。

2、サービス自動起動設定と認証テスト

#/etc/init.d/smb start
#/etc/init.d/winbind start
#chkconfig --add smb
#chkconfig --add winbind
#chkconfig smb on
#chkconfig winbind on
#chkconfig --list | grep -e smb -e winbind
↑問題なく起動したらchkconfig で自動的に起動するように設定

#wbinfo -t
checking the trust secret for domain DOMAIN via RPC calls succeeded
↑RPC callテスト succeededでOK

#wbinfo -u
↑AD上のユーザリストがずらずら出たらOK

#wbinfo -a DOMAIN\\ユーザ名%パスワード
plaintext password authentication succeeded
challenge/response password authentication succeeded
↑どっちもsucceededならOK

これでLinuxからADに認証にいける状態になっていることを確認。

3、squidの認証設定

squidにきたユーザをADで自動的に認証してOKならWebへアクセスできる、NGならdeny。
ここまでの設定はsquid関係無かったので、配下のクライアントは問題なくプロキシ経由で
Webへ出ることが出来ていたが、ここから先は間違えるとアクセスできなくなる。


#vi /etc/squid/squid.conf

auth_param ntlm program /usr/local/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 5
↑ntlm_authのパスがソースからとパッケージからの場合違うから注意

acl password proxy_auth REQUIRED
acl passauth src 192.168.1.0/24

#http_access allow localnet ←許可ルールを無効にする localnet はそれぞれ読み替えて
http_access allow passauth password ←認証できたら許可のルールにする
http_access deny all ← それ以外拒否、これは多分もともとあると思う。

logformatのところで %un とか %ulを指定しておく。

:wq

#chmod 770 /var/lib/samba/winbindd_privileged
#chown root.squid /var/lib/samba/winbindd_privileged
#cp -rp /var/lib/samba/winbindd_privileged /var/cache/samba/
↑squidがwinbindの作ったファイルを見れるようにする

/etc/init.d/squid reload

AD認証でログインしているクライアントから適当にwebアクセスする。

#tail -n 50 /var/log/squid/access.log ←アクセスログの場所変えてたらそこ
ユーザ名が表示されてたらOK

おつかれさま。

0 件のコメント:

コメントを投稿