qiita にまとめました。 https://qiita.com/bashaway/items/6adc75265973de9b5fcc #contents * 目的 [#tba9012a] -squidのログにAD認証したユーザ名を表示させたい。~ -ADのセキュリティグループ別にユーザがどこにアクセスできるか制限する。~ -外部へ直接抜けるルートはFWにて遮断されている。~ -外部へのwebアクセスはsquidでの直接取得か上位プロキシ経由での取得となる。~ * 実現方法 [#raf60b68] +ユーザ別アクセス方法 ++通常ユーザ~ ADの特定グループ(proxy_unlimit)に所属しているユーザ~ フルアクセスで利用させる~ ++制限ユーザ~ ADの特定グループ(proxy_limit)に所属しているユーザ~ イントラネット内の特定サーバに限り利用させる~ ++システムユーザ~ ADに所属していないユーザ~ 特定サイト(セキュリティアップデートなど)に限り利用させる~ +接続先URL別アクセス方法 ++制限なしサイト~ 特定サイト(セキュリティアップデートなど)はNTLM認証を実施する場合や~ ADに所属していないユーザからリクエストを受けた場合などで動作できないため~ 認証なしでアクセス可とする~ ++社内イントラサイト~ ADのセキュリティグループにかかわらずアクセス可とする~ ++その他の一般サイト~ ADの特定グループ(proxy_unlimit)に所属するユーザのみアクセス可とする~ * 環境 [#ha46e8c2] >Active Directory シングルフォレスト、シングルドメインの構成~ virtual.prosper2.org~ >ADサーバ#1(VMad01:192.168.10.204)~ WindowsServer2008R2SP1(試用版)~ ActiveDirectoryとDNSサービス稼動中~ >ADサーバ#2(VMad02:192.168.10.205)~ WindowsServer2008R2SP1(試用版)~ ActiveDirectoryとDNSサービス稼動中~ #1の情報を自動レプリケーション~ >プロキシ(VMproxy01:192.168.10.201):CentOS6.3~ squid(3.1.10)~ samba(3.5.10)~ yumでのインストール~ [VMproxy01]# yum install squid samba samba-winbind~ >通常上位プロキシ(VMpxext01:192.168.10.202):CentOS6.3~ squid(3.1.10)~ yumでのインストール~ [VMproxy01]# yum install squid~ >ブラウザ(192.168.20.0/24:DHCP):WindowsXP~ InternetExplorer8~ * 作業内容 [#q63a61b3] ** プロキシサーバのAD参加 [#k0ed7401] *** リゾルバの設定でドメイン名とNSを指定 [#nf69de3b] #vi /etc/resolv.conf search VIRTUAL.PROSPER2.LOCAL nameserver 192.168.10.204 *** hostsファイルに自サーバ名を登録 [#t5a1560f] #vi /etc/hosts 127.0.0.1 VMproxy01 *** ADに登録されるコンピュータ名を設定 [#hd3aee40] #vi /etc/sysconfig/network NETWORKING=yes HOSTNAME=VMproxy01 *** 指定したADサーバに登録するための設定 [#za700cc6] #vi /etc/samba/smb.conf workgroup = VIRTUAL server string = VMproxy01 security = ads hosts allow = 127. realm = VIRTUAL.PROSPER2.LOCAL *** 認証系の設定ファイル書き換え(winbindを利用、kerberos認証を利用) [#i563b5a1] #LANG=en_US ;authconfigがうまく動かない場合があるらしい #authconfig --enablewinbind --update ;コマンドで/etc/nsswitch.confを書き換えてくれる #authconfig --krb5kdc=192.168.10.204 --krb5realm=VIRTUAL.PROSPER2.LOCAL --update ;コマンドで/etc/krb5.confを書き換えてくれる *** プロキシサーバ登録用ユーザをADに作成 [#r1654dff] ユーザ名:squid~ パスワード:squidpass~ として設定する。~ 一応ADのユーザになるわけだから、このユーザ名ではwindowsログオンできないようにしておいたほうがいいのかもしれない。 *** コンピュータをADに登録 [#i7544018] #/etc/init.d/smb stop #/etc/init.d/winbind stop ;テストでしくったときに影響を与えないようにサービスとしては停止しておく # net ads join -U squid ;ADに参加しているユーザを指定(ここではプロキシ動作のためのADユーザを指定) Enter squid's password: Using short domain name -- VIRTUAL Joined 'VMPROXY01' to realm 'virtual.prosper2.org' No DNS domain configured for vmproxy01. Unable to perform DNS Update. DNS update failed! なんかエラーみたいだけどOK。ADで自動インストールされたDNSにも正引き、逆引きで登録しておく。 ** 動作チェックなど [#vd96f18b] *** デーモンの起動と自動起動の設定をいれておく [#c42ab582] #/etc/init.d/smb start #/etc/init.d/winbind start #chkconfig --add smb #chkconfig --add winbind #chkconfig smb on #chkconfig winbind on *** サービス稼動状況 [#dfb1c62e] #wbinfo -t checking the trust secret for domain DOMAIN via RPC calls succeeded と表示されていればOK(rootでのみ確認可能) *** ユーザ一覧 [#x02ef5a2] #wbinfo -u VIRTUAL\administrator VIRTUAL\guest VIRTUAL\krbtgt VIRTUAL\squid VIRTUAL\u-limit VIRTUAL\u-unlimit でユーザがリストアップされていればOK *** ユーザ認証 [#zb6e14ba] #wbinfo -a VIRTUAL.PROSPER2.ORG\\UID%PWD plaintext password authentication succeeded challenge/response password authentication succeeded と表示されていればOK ** sambaとsquidの連携設定(権限追加) [#i01bdb85] *** squidにwinbindの権限を追加 [#n7f35c56] # id squid uid=23(squid) gid=23(squid) groups=23(squid) # usermod -G wbpriv squid # id squid uid=23(squid) gid=23(squid) groups=23(squid),88(wbpriv) でsquidがwbprivに所属していればOK ** squid.confの修正 [#pad3c7b5] #基本的な設定~ visible_hostname VMproxy01 #NTLM認証の基本的な設定とACL auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp auth_param ntlm children 5 external_acl_type ldap_group %LOGIN /usr/lib/squid/squid_ldap_group -v 3 -b "OU=ALPHA,DC=VIRTUAL,DC=PROSPER2,DC=ORG" -h 192.168.10.204 -D "CN=squid,OU=ALPHA,DC=VIRTUAL,DC=PROSPER2,DC=ORG" -w squidpass -f "(&(objectclass=person)(sAMAccountName=%u)(memberOf=CN=%g,OU=ALPHA,DC=VIRTUAL,DC=PROSPER2,DC=ORG))" -S acl gr_unlimit external ldap_group proxy_unlimit acl gr_limit external ldap_group proxy_limit acl whitelist url_regex -i "/etc/squid/whitelist.txt" acl intrasite url_regex -i "/etc/squid/intrasite.txt" acl clientlist src "/etc/squid/clientlist.txt" #ADに登録されたメンバーにプロキシ利用の許可を与える # deny : from unexpected clients http_access deny !clientlist # permit : any client to whitelist # no logging username http_access allow whitelist # permit : AD Security Group # logging username http_access allow gr_unlimit http_access allow gr_limit # deny : default http_access deny all # 192.168.10.202 VMpxext01 cache_peer 192.168.10.202 parent 3128 0 no-query # permit : any client to whitelist cache_peer_access 192.168.10.202 allow whitelist # permit : Unlimit group to any cache_peer_access 192.168.10.202 allow gr_unlimit # permit : Limit group to intrasite cache_peer_access 192.168.10.202 allow gr_limit intrasite cache_peer_access 192.168.10.202 deny gr_limit !intrasite cache_peer_access 192.168.10.202 deny all always_direct allow intrasite never_direct allow all ** その他の注意事項など [#y370de44] ***ログ表示 [#oc1d2b8f] #tailf /var/log/squid/access.log 1357570423.423 0 192.168.20.35 TCP_DENIED/407 4670 GET http://www.google.co.jp/ - NONE/- text/html 1357570423.815 373 192.168.20.35 TCP_MISS/200 25077 GET http://www.google.co.jp/ VIRTUAL\XXXX DIRECT/74.125.235.120 text/html リターンコード407で認証が必要とされたあとにすぐ200で正常に完了している。 *** 設定ファイルの反映 [#h6b1d7c2] whitelist.txt,intrasite.txt,clientlist.txt は squid の通常ACLを利用しているため~ テキストファイルを反映しても、設定ファイルの再読み込み(reload)をしないと 反映されない。 *** ログへのユーザ名表示 [#b1ed60a5] ユーザ名は squid.conf のhttp_access ラインで判断するため http_accessのACLにユーザ判別の~ 処理が含まれていないと表示することができない。~ そのため、whitelistのアクセス時にはユーザ名がロギングされない。 *** ホワイトリストの更新 [#p9752430] システムユーザおよび制限ユーザがアクセスできるホワイトリストはアクセスしたいURLだけでなく~ 同時に読み込まれるURLについても許可してあげないと、挙動がおかしくなる可能性があるので、注意~ (下記コンフィグにあるように、microsoftのサイトだが、別ドメインのファイルを読んでいる)~ 制限ユーザであれば、アクセスできないだけだが、システムユーザだと407で弾かれるため、~ ブラウザでのポップアップやバックグラウンドで動作するプログラムでは正常に動作しない可能性がある。~ * 設定ファイル [#c125c949] ** squid.conf [#c9942f79] [root@VMproxy01 ~]# cat /etc/squid/squid.conf auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp auth_param ntlm children 5 external_acl_type ldap_group %LOGIN /usr/lib/squid/squid_ldap_group -v 3 -b "OU=ALPHA,DC=VIRTUAL,DC=PROSPER2,DC=ORG" -h 192.168.10.204 -D "CN=squid,OU=ALPHA,DC=VIRTUAL,DC=PROSPER2,DC=ORG" -w squidpass -f "(&(objectclass=person)(sAMAccountName=%u)(memberOf=CN=%g,OU=ALPHA,DC=VIRTUAL,DC=PROSPER2,DC=ORG))" -S acl gr_unlimit external ldap_group proxy_unlimit acl gr_limit external ldap_group proxy_limit acl whitelist url_regex -i "/etc/squid/whitelist.txt" acl intrasite url_regex -i "/etc/squid/intrasite.txt" acl clientlist src "/etc/squid/clientlist.txt" acl manager proto cache_object acl localhost src localhost acl localhost src 127.0.0.1/32 acl SSL_ports port 443 acl Safe_ports port 80 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 # https acl Safe_ports port 70 # gopher acl Safe_ports port 210 # wais acl Safe_ports port 1025-65535 # unregistered ports acl Safe_ports port 280 # http-mgmt acl Safe_ports port 488 # gss-http acl Safe_ports port 591 # filemaker acl Safe_ports port 777 # multiling http acl CONNECT method CONNECT http_access allow manager localhost http_access deny manager http_access deny !Safe_ports http_access deny CONNECT !SSL_ports # deny : from unexpected clients http_access deny !clientlist # permit : any client to whitelist # no logging username http_access allow whitelist # permit : AD Security Group # logging username http_access allow gr_unlimit http_access allow gr_limit # deny : default http_access deny all # 192.168.10.202 VMpxext01 cache_peer 192.168.10.202 parent 3128 0 no-query # permit : any client to whitelist cache_peer_access 192.168.10.202 allow whitelist # permit : Unlimit group to any cache_peer_access 192.168.10.202 allow gr_unlimit # permit : Limit group to intrasite cache_peer_access 192.168.10.202 allow gr_limit intrasite cache_peer_access 192.168.10.202 deny gr_limit !intrasite cache_peer_access 192.168.10.202 deny all always_direct allow intrasite never_direct allow all # Squid normally listens to port 3128 http_port 3128 # We recommend you to use at least the following line. hierarchy_stoplist cgi-bin ? # Uncomment and adjust the following to add a disk cache directory. #cache_dir ufs /var/spool/squid 100 16 256 # Leave coredumps in the first cache dir coredump_dir /var/spool/squid # Add any of your own refresh_pattern entries above these. refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 refresh_pattern . 0 20% 4320 visible_hostname VMproxy01 ** whitelist.txt [#jca7e7bd] [root@VMproxy01 ~]# cat /etc/squid/whitelist.txt adobe.com adobe.co.jp adobe.jp windowsupdate.com windowsupdate.co.jp microsoft.com microsoft.co.jp aspnetcdn.com webtrends.com jquery.com msn.com atdmt.com ** intrasite.txt [#v4fe7349] [root@VMproxy01 squid]# cat /etc/squid/intrasite.txt www.prosper2.org taruo.net ugtop.com ** clientlist.txt [#l31f824c] [root@VMproxy01 squid]# cat /etc/squid/clientlist.txt 192.168.10.0/24 192.168.20.0/24 ~ ~ #counter