2022年11月15日 星期二

使用Synology LDAP server搭配 Ubuntu LDAP client帳號登錄

 後續要進行computing cluste建置,

另外儲存體將會獨立到NAS上(未來也有可能建立SAN),

統一控管帳號讓使用者可以用同一帳號就登錄到資料中心的所有機器上管理起來會比較方便。


幾個要點:

  1. synology LDAP server支援OpenLDAP格式。所以Windows的AD(Active directireies)服務沒辦法跑。如果有需要用到windows的LDAP,就要使用synology的另外一項服務"Synology Directory server"。從描述看起來用Synology Directory server的好處很多,但會佔用到DNS server,所以暫時先不考慮。(有些LDAP預設是吃AD格式,例如 Draytek 的router。這些LDAP就無法跟synology的NAS結合)
  2. synology LDAP server可以跟Open LDAP相容,所以基本上Linux都能跑。
  3. 測試環境使用的是Ubuntu。在Ubuntu上使用SSSD服務來結合LDAP server設定上會相對簡單。甚至我的經驗是單純使用Ubuntu的LDAP client完全沒辦法跑起來。


Server端

透過Synology的套件管理安裝 LDAP server。安裝以後到 LDAP server 的設定頁面將服務開啟。設定FQDN( fully qualified domain name )為組織的從屬狀態。例如這次實驗室的FQDN為cri.lab,就把該從屬資訊放上去即可。再將 LDAP 登錄密碼填上。

將"控制台"  -> "網域/LDAP"打開。設定 LDAP server 連線。基本上 server IP 填寫 127.0.0.1 也可以運作。


設定完畢後,就要進到"編輯"。這邊一些結構上的設定頗重要。"展開巢狀群組"的勾勾一定要拿掉,不然SSSD的服務會認不到。




 使用上,Synology對Synology的 LDAP 對接都不會有太大問題。但是到Ubuntu等等的系統問題就會很多。server 端基本上到這邊就完畢了。


Client端

  • 先安裝 LDAP 相關 package。

apt install sssd libpam-sss libnss-sss sssd-tools

  •  把設定檔放入。因為預設是沒有conf file的,所以還需要手動製造一下。後面權限也要設定為root跟root唯讀:

root:~# touch /etc/sssd/sssd.conf
root:~# chmod 600 /etc/sssd/sssd.conf
root:~# chown root:root /etc/sssd/sssd.conf
Enable and start the sssd serviceroot:~# systemctl enable sssd
root:~# systemctl start sssd

 

  •  打開 /etc/sssd/sssd.conf ,把以下內容貼上去

[domain/cri.lab]
ldap_tls_reqcert = never
id_provider = ldap
auth_provider = ldap
chpass_provider = ldap
sudo_provider = ldap
#IP address of the NAS
ldap_uri = ldap://xxx.xxx.xxx.xxx
#Base DN from our LDAP server configuration.
ldap_search_base=dc=cri,dc=lab
#Bind DN from our LDAP server configuration.
ldap_default_bind_dn = uid=root,cn=users,dc=cri,dc=lab
ldap_default_authtok_type = password
#Password from our LDAP server configuration.
ldap_default_authtok = <myldappassword>
cache_credentials = True
use_fully_qualified_names = False
# 加入這行來強制/預設使用 bash override_shell = /bin/bash[sssd]
config_file_version = 2
services = nss,pam
#FQDN from LDAP server
domains = cri.lab
[nss][pam][sudo]

 設定上的幾個要點:   

1)讀取的根在[sssd]底下,設定的位置是 domains 。domains後面可以連接很多不同的位置,這邊範例只有 cri.lab ,所以就打上 cri.lab ,sss就會去 [domain/cri.lab] 的 tag 底下找LDAP的server資訊。 其他地方不需要多做修改。  

2) 進入到 [domain/cri.lab] 章節內,基本上大多不需要多做修改。只有在 ldap_uri 要改成LDAP server的IP(也就是NAS的IP)。ldap_search_base 改為 dc=cri,dc=lab 。ldap_default_bind_dn 這步可以直接開NAS上的 LDAP server ,最底下有個連線資訊,直接ctrl-c、ctrl-v即可。ldap_default_authtok 就是一開始設定的LDAP連線密碼,記得修改。不過如果對於明碼張貼有疑慮,也可以用加密方式貼上,請參考 sss_obfuscate   指令。

 

  • 重新啟動sssd

root:~# systemctl enable sssd root:~# systemctl restart sssd

可以使用 getent passwd xxxx 測試,xxxx就是設定在 LDAP server裡面的帳號。如果有順利連接上就能看到帳號後面的的資訊。

            後面可以稍微測試一下到底ssd有沒有作用

 root:~# getent passwd <<某個ldap user>>

            後面如果出現類似的狀況就是可以動:
 <<某個ldap user>>:*:1000017:1000001:<<某個ldap user>>:/home/<<某個ldap user>>:/bin/sh

  • 自動設定home
修改完畢後就可以透過LDAP登陸。但這些使用者都不會被系統寫入到/etc/passwd中。也就是這些使用者會缺乏一些設定,例如不會有自己的home。這邊可以自動創建:

root:~# pam-auth-update --enable mkhomedir 

  • 修改預設shell

ubuntut系統預設都是sh進行登錄。除非有指定特定shell才會進行切換。因為我們在製作Ubuntu帳號的時候,ubuntu的指令會幫忙設定成bash,因此可以省下不少事情。如果透過LDAP 設定就不會有這段。

只能透過修改 LDAP 紀錄的方式。這部分只能在登錄的機器上執行,無法在synology的NAS進行。 

這邊的設定就是希望ldap自身的使用者就能修改自己的shell,所以使用者自己就可以做了。不需動到管理者權限。

首先在任意一個地方先創建一個檔名為 changeshell.ldap ,然後編輯它:

dn: uid=testuser,cn=users,dc=cri,dc=lab changetype: modify replace: loginShell loginShell: /bin/bash

uid 就是要更換的帳號。這邊假設是有個帳號叫做 testuser ,要更換成 bash。敲定後就用 ldapmodify 指令進行更換(不需要用到root也可達成):

 testuser:~$ ldapmofity -f changeshell.ldap -W -D "uid=root,cn=users,dc=cri,dc=lab"

後面希望LDAP使用者在透過LDAP創建後,就能直接使用到docker。這邊提供幾個方法。


方法1. 直接對齊gid (目前最有效的方法)

接下來要對齊ldap上面的docker group id跟系統的docker group id,不過首先要先回去確定原本的ldap上面有docker的群組,沒有就記得回去創建之後,把ldap user放到docker群組裡面,再進行以下步驟:

sudo groupdel docker #把原本主機上面的docker群組移除,因為id一定不一樣

sudo sss_cache -E #把ldap上面的群組都抓下來,包括docker 的 id

sudo getent group docker #看一下號碼

sudo chgrp docker /var/run/docker.sock #把號碼更換sock當中,不過這是當下生效,下次開機還是會不見

sudo mkdir -p /etc/systemd/system/docker.socket.d

sudo vim /etc/systemd/system/docker.socket.d/override.conf  #打開之後,依照下面狀況修改

[Socket] 

SocketGroup=<剛剛看到的群組號碼或是直接寫docker,呼應ldap的群組>

sudo systemctl daemon-reload 

sudo systemctl restart docker.socket docker.service

最後讓SSSD登錄時,可以自動長出home

sudo pam-auth-update --enable mkhomedir


方法2. 

就直接把 LDAP 的 user group 放到sudoer中,並且免除使用者輸入密碼(少一次互動在後面佈署CI/CD會比較方便)。LDAP 的群組預設編號是1000001,所以先進入到 /etc/group 創建一個group。這邊只能手動創建,如果使用add group會從目前編號後繼續進行編號,而我們需要指定group的號碼,所以就只能手動處理,無法透過指令:

ldapuser:x:1000001:  

<修改1>接著修改sudo:

root:~# visudo %#1000001 ALL=(ALL:ALL) NOPASSWD: /usr/bin/docker

注意如果群組名稱就是用%標訂,但是如果用gid加入就是用%#標訂。這樣使用者就能透過 sudo docker run 來跑container了。缺點就是使用者還是要打上sudo才能使用docker(打sudo才能吃到設定檔)。

          <修改2>進行pam的group成員規則

要先進入到/etc/pam.d/comman-auth修改規則,系統預設不會開啟pam_group,所以要把這功能打開。先備份一下:
root:~# cp -a /etc/pam.d/common-auth /etc/pam.d/common-auth~

root:~# vim /etc/pam.d/common-auth

把這一行加入到最後面:

auth optional pam_group.so


修改/etc/security/group.conf。一樣先備份一下:

cp -a /etc/security/group.conf  /etc/security/group.conf~
vim /etc/security/group.conf 

把這段加入 ( times = Al0000-2400:時間條件,Al 代表每一天,0000-2400 代表全天,所以等於「任何時間」)

*;*;%ldapuser;Al0000-2400;docker

進行測試前,很重要: 另外開一個對話框來登入,防止這邊設定錯誤了沒辦法再登入


方法3.

這邊的使用情境比較類似該docker server上主要都用來跑docker,而且所有user都是透過ldap認證。算是比較髒的作法: 把LDAP的user跟docker group視為同一個group。 上面提及ldap user在ubuntu的sssd預設的user group就是10000001,所以編輯 /etc/group 裡面的 docker:

 docker:x:1000001:

這樣只要是透過ldap登錄的user都能使用docker而不用root。


方法4. 修改ldap的加入模式,有人使用ldap登錄後,直接就會被放到docker的group底下,使用者就不需要打sudo

          修改/etc/adduser.conf,補上以下內容:

EXTRA_GROUPS="docker"

ADD_EXTRA_GROUPS=1

方法5. 透過pam security機制

          修改//etc/security/group.conf,補上以下內容:

# 服務; tty; 使用者; 時間; 群組 *; *; *; Al0000-2400; docker

           其中: 對於任何服務 (*)、任何終端機 (*)、任何使用者 (*)、在任何時間 (Al0000-2400 即 Always),自動加入 docker 群組。


NOTE

  • 使用SSS以後,LDAP在本機上的狀況就不太重要。因為SSS本身就會透過LDAP協定去LDAP server上取用資訊。如果要把LDAP機制關閉,就使用 systemctl stop sssd 指令。
  • 使用SSS以後,認證機制是先從系統找使用者,如果有一樣的使用者同時存在系統上與LDAP上,就會優先使用系統上的使用者。但經過測試,密碼使用系統或是LDAP的密碼都可以動作。


references:

  1. https://stevex0r.medium.com/setup-ldap-with-autofs-on-a-synology-nas-e1dcc835d4f4
  2. https://community.synology.com/enu/forum/17/post/82944
  3. https://ubuntu.com/server/docs/service-sssd-ldap
  4. https://serverfault.com/questions/790577/how-to-change-from-the-default-shell-authenticating-using-sssd-ad

沒有留言:

張貼留言

torch compile for cudagraph

option 1 TORCH_LOGS="graph_breaks" python transmitter_trainner.py option 2 import torch._dynamo # 這會把導致斷圖的原因直接印在螢幕上 torch._dynamo....