2017年9月17日日曜日

[CentOS7] SquidでADと連携する方法

概要

CentOS6ではADと連携するために、squid_ldap_authモジュールとsquid_ldap_groupモジュールを使用していたが、CentOS7ではそれらの代わりとして、basic_ldap_authモジュールとext_ldap_group_aclモジュールを使用する。

前提条件

SSSDが設定済みでActive Directoryと連携ができていること。

参考:[CentOS7] Active Directoryとの連携にSSSDを使用する方法

NOTE:
squidとADの連携にSamba、Samba-winbindは不要。

squidの設定

ドメインコントローラに接続してユーザ名とパスワードを検証した後、ユーザがadusersグループに所属しているかを確認する。
adusersグループに所属している場合はアクセスを許可する。

# vi /etc/squid/squid.conf

~省略~

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
auth_param basic program /usr/lib64/squid/basic_ldap_auth -v3 -R -b "DC=TEST,DC=LOCAL" -D "CN=LDAP検索実行ユーザ,CN=USERS,DC=TEST,DC=LOCAL" -w "LDAP検索実行ユーザのパスワード" -f "(&(userPrincipalName=%s)(objectClass=Person))" -h win2012r2ad.test.local
auth_param basic children 5

external_acl_type ldap_group ttl=30 %LOGIN /usr/lib64/squid/ext_ldap_group_acl -v 3 -R -b "DC=TEST,DC=LOCAL" -D "CN=LDAP検索実行ユーザ,CN=USERS,DC=TEST,DC=LOCAL" -w "LDAP検索実行ユーザのパスワード" -f '(&(objectclass=person)(sAMAccountName=%u)(memberof=CN=%g,OU=GROUPS,DC=test,DC=local))' -h win2012r2ad.test.local -S

acl adusers_group external ldap_group adusers
http_access allow adusers_group
http_access deny all

~省略~

# systemctl restart squid

確認

basic_ldap_authモジュールとext_ldap_group_aclモジュールの確認

basic_ldap_authを実行後、ADで検証を行いたいユーザ名、パスワードを入力してEnterを押す。
OKが表示されることを確認する。

# /usr/lib64/squid/basic_ldap_auth -v3 -R -b "DC=TEST,DC=LOCAL" -D "CN=LDAP検索実行ユーザ,CN=USERS,DC=TEST,DC=LOCAL" -w "LDAP検索実行ユーザのパスワード" -f "(&(userPrincipalName=%s)(objectClass=Person))" -h win2012r2ad.test.local
ユーザ名@test.local パスワード
OK

ext_ldap_group_aclを実行後、ADで検証を行いたいユーザ名、グループを入力してEnterを押す。
OKが表示されることを確認する。

# /usr/lib64/squid/ext_ldap_group_acl -v 3 -R -b "DC=TEST,DC=LOCAL" -D "CN=LDAP検索実行ユーザ,CN=USERS,DC=TEST,DC=LOCAL" -w "LDAP検索実行ユーザのパスワード" -f '(&(objectclass=person)(sAMAccountName=%u)(memberof=CN=%g,OU=GROUPS,DC=test,DC=local))' -h win2012r2ad.test.local -S
ユーザ名 adusers
OK

TIPS:
ERRが表示される場合は-fの後に指定しているフィルタ文字列がdsgetコマンドやdsqueryで表示される値と一致していることを確認する。

C:\>dsget user "CN=aduser1,CN=USERS,DC=TEST,DC=LOCAL" -memberof
"CN=adusers,OU=GROUPS,DC=test,DC=local"
"CN=Domain Users,CN=Users,DC=test,DC=local"

C:\>dsquery * "CN=aduser1,CN=USERS,DC=TEST,DC=LOCAL" -attr *
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
cn: aduser1
sn: aduser1
distinguishedName: CN=aduser1,CN=Users,DC=test,DC=local
instanceType: 4
whenCreated: 09/12/2017 07:57:32
whenChanged: 09/12/2017 08:11:52
displayName: aduser1
uSNCreated: 12826
memberOf: CN=adusers,OU=GROUPS,DC=test,DC=local
uSNChanged: 12838
name: aduser1
objectGUID: {71BD8F05-D759-4AE8-AE70-704952D82C2B}
userAccountControl: 66048
badPwdCount: 0
codePage: 0
countryCode: 0
badPasswordTime: 131496775071793748
lastLogoff: 0
lastLogon: 131496775128011622
pwdLastSet: 131496766523508948
primaryGroupID: 513
objectSid: S-1-5-21-2954009348-2995245008-3656725404-1106
accountExpires: 9223372036854775807
logonCount: 2
sAMAccountName: aduser1
sAMAccountType: 805306368
userPrincipalName: aduser1@test.local
objectCategory: CN=Person,CN=Schema,CN=Configuration,DC=test,DC=local
dSCorePropagationData: 09/12/2017 07:57:32
dSCorePropagationData: 01/01/1601 00:00:00
lastLogonTimestamp: 131496775128011622
ADsPath: LDAP://WIN2012R2AD.test.local/CN=aduser1,CN=Users,DC=test,DC=local

ブラウザでの確認

  • インターネット接続時にユーザ名、パスワードを入力するダイアログが表示されること。
  • adusersグループに所属しているユーザはインターネットに接続できること。
  • adusersグループに所属していないユーザはアクセスが許可されないこと。

参考

  • basic_ldap_auth(8)
  • ext_ldap_group_acl(8)

1 件のコメント:

  1. 貴重な情報の提供をいただきありがとうございます
    お陰様でActive Directoryで管理したユーザグループごとにアクセス可能なサーバを制御するといったことが可能になりました

    2点ほど実装する上で気になった部分を指摘させてください
    前提条件として「SSSDが設定済みでActive Directoryと連携ができていること」と書かれていらっしゃいますが、自分の環境ではrealmd等のインストールは必要でしたが、ADドメインにjoinする必要はありませんでした

    もう1点、squid.confの中の basic_ldap_auth に関するフィルタで userPrincipalName=%s とされている部分、ext_ldap_group_acl の行とあわせて sAMAccountName を使った方がいいように感じました

    両方 sAMAccountName を使うことで、ユーザが@ドメイン名を入力する必要がなくなるように思いました

    差し出がましいようで申し訳ないのですが、情報提供とさせてください

    ともあれ、こちらの情報には大変助けていただきました
    ありがとうございました

    返信削除