2022年11月29日 星期二

使用Synology LDAP帳號與自架設Gitlab帳號系統串接

目前Synology已經將Gitlab移除維護名單之外。依照很多不同的文章都說明要在Synology NAS上架設Gitlab,最簡單的方式還是採用Docker進行。但Synology的docker只能跑在x86系列的機器上,所以就只能購買plus系列的機器。現在就假設大家都已經有Synology的plus系列的NAS,並且已經安裝好docker。


設定LDAP帳號系統:

方法可以參考: http://murmur.markliou.tw/2022/11/synology-ldap-server-ubuntu-ldap-client.html 
上半部設定LDAP的方式。


使用環境設定如下:

  1. 使用Synology LDAP service
  2. 透過Docker架設gitlab
  3. 最終目標為在Synology NAS上架設Gitlab(使用Docker),並經由Webstation的reverse proxy將服務導至gitlab上。(需搭配DNS)

Gitlab安裝:
假設已經完成gitlab的docker架設。使用的版本是 gitlab/gitlab-ce:15.6.2-ce.0。Gitlab在使用上有幾個比較重要的Data需要保留,分別是data、config、logs,詳細掛載方式可以參考官方文件。以下還是提供官方建議的docker指令下法:

sudo docker run --detach \ --hostname gitlab.example.com \ --publish 443:443 --publish 80:80 --publish 22:22 \ --name gitlab \ --restart always \ --volume $GITLAB_HOME/config:/etc/gitlab \ --volume $GITLAB_HOME/logs:/var/log/gitlab \ --volume $GITLAB_HOME/data:/var/opt/gitlab \ --shm-size 256m \ gitlab/gitlab-ee:latest


不過在synology的Docker設定上就需要透過GUI進行。不難操作,就先額外開三個資料夾然後到設定中進行掛載。如果還是不清楚也可以參考其他人的文章


Gitlab設定檔:
主要設定檔放在 /etc/gitlab/gitlab.rb 。對應到docker掛載folder就應該落在config資料夾中。
找到以下幾行進行修改:
gitlab_rails['ldap_servers'] = {
  'main' => {
    'label' => 'LDAP',
    'host' =>  '192.168.81.51',
    'port' => 389,
    'uid' => 'cn',
    'encryption' => 'plain',
    'verify_certificates' => false,
    'bind_dn' => 'uid=root,cn=users,dc=cri,dc=lab',
    'password' => '????????',
    'timeout' => 10,
    'active_directory' => false,
    'allow_username_or_email_login' => true,
    'block_auto_created_users' => false,
    'base' => 'dc=cri,dc=lab',
    'user_filter' => '',
    'lowercase_usernames' => false,
    # EE Only
    'group_base' => '',
    'admin_group' => '',
    'external_groups' => [],
    'sync_ssh_keys' => false
  }
}

其中:
  • host是LDAP server的位置
  • port是LDAP對應的port,389是不加密,636就是加密。我的server是設定不加密,因此用389。
  • uid: 這邊是決定user在哪一層。Synology是訂在層
  • encryption是加密方式。我用的是不加密,因此是plain
  • bind_dn就直接到synology的LDAP server上就有提供
  • password是LDAP的密碼。
  • active_directory是windows的AD格式,我用的是synology的openLDAP格式,所以AD這邊設定為false。
  • base也用synology的LDAP server底下提供的就行了。

特殊設定的部分,就是要同步gitlab的LDAP權限。因為gitlab呼叫LDAP以後會把資訊站存。但是如果有人離開要把他的權限關閉,單純在LDAP server設定gitlab還是吃不到。必須要讓gitlab主動去跟LDAP server同步:
gitlab_rails['ldap_sync_worker_cron'] = "0 */12 * * *"
這樣就是12小時同步一次。詳細可以參考這邊

reverse proxy:
位置在:   控制台 > 登入入口 > 進階
把原本的 domain name的443對應到docker開出來的port就可以了。


Reference:
https://docs.gitlab.com/ee/administration/auth/ldap/
https://docs.gitlab.com/ee/administration/auth/ldap/ldap_synchronization.html
https://www.796t.com/article.php?id=100546

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
[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裡面的帳號。如果有順利連接上就能看到帳號後面的的資訊。

  • 自動設定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. 

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

ldapuser:x:1000001:  

接著修改sudo:

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

注意如果群組名稱就是用%標訂,但是如果用gid加入就是用%#標訂。這樣使用者就能透過 sudo docker run 來跑container了。


方法2.

這邊的使用情境比較類似該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。


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

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

EXTRA_GROUPS="docker"

ADD_EXTRA_GROUPS=1


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

iscsi 連線問題筆記

如果要進行umount但是出現target buzy sudo fuser -km 掛載點 sudo umount 掛載點 iSCSI重啟 sudo open-iscsi restart  掛載lun iscsiadm -m discovery -t sendtargets -p...