2022年12月26日 星期一

自行架設的Gitlab被鎖住解決辦法

先說明,這是"自行架設"的才能這樣做。如果是gitlab官方同時又是個體戶那百分之百是沒救了。

大概可以分成兩種方式去解。第一種是透過gitlab後台指令去修改密碼。第二種就是進入到管理網頁修改。這邊的狀況比較複雜,假設來讀這篇文章的人跟我一樣是接受整個gitlab server 的檔案,後續可以用Docker進行掛載。但是當初移交給你的人當初只有給你檔案,沒有移交administrator的密碼。

這邊需要釐清幾個名詞:

  1. username : 這是當初使用者設定的帳號名稱。不要跟id搞錯。
  2. ID : 這是一開始註冊的時候,gitlab server給你的流水號。通常大家不會記得這個號碼。root的編號就是1。
  3. email : 就是當初註冊的email
username跟ID比較容易搞亂。


1. 使用後台指令reset密碼

container起來以後,用以下指令:

gitlab-rake "gitlab:password:reset"

這邊沒有用到sudo是因為在container底下本來就是root了。如果是在單機版上,記得加上sudo。

後續就會有一連串問答。

如果已經知道username,那也可以直接用username進行:

sudo gitlab-rake "gitlab:password:reset[USERNAME]"

進行到這邊就會有一連串的密碼問答。想透過後gitlab console進行密碼更換也可以參考這篇文章

通常修改密碼的狀態下都是伴隨打錯密碼太多次造成block。或是LDAP跟localhost註冊相衝[註1]或是LDAP的檢查時機有誤[註2],都可能造成帳號鎖住,這狀況可看底下說明。


2. 使用後台指令把block狀態解除

首先把gitlab console打開:

sudo gitlab-rails console -e production

接下來可以用email解開

user = User.find_by(email: 'admin@local.host') user.unlock_access!

或是用id來解開

user = User.where(id: 1).first user.unlock_access!

如果覺得有where不好看,也可以用稍微優雅的方式

user = User.find(1) user.unlock_access!


或是用username來解開

user = User.find_by_username 'exampleuser' user.unlock_access!


其他事項1: 修改administator進入管理頁面

gitlab的administrator使用的ID是1,也就是用後台的方式把ID為1的密碼改掉。接下來到登錄頁面後使用"root",並且把剛剛修改的密碼打上就能進入管理頁面。


其他事項2: 如果因為被LDAP連結連錯而被鎖住

首先要先進入到管理頁面,把左邊的scrolling bar拉下來:

Overview -> users 

在右邊主欄位可以看到"blocked"的頁面。進入後可以看到被鎖住的使用者。點入後找到"identity"的tab,進去以後把gitalab連結上的credential刪除即可。

接下來回到原本user的管理頁面,該user最旁邊的"三點"選單裡面的"unlock"選項就會出現。

但這邊要記住,如果該使用者又帶有相同email的ldap進入,有可能會再度造成連結錯誤。所以建議有localhost帳號的使用者就不要再用ldap登錄。



註1. LDAP與本地端相衝問題

當初接到這個server檔案時,本來已經有用我自己的帳號註冊了一個username。但是後來實驗室有新增LDAP,這個LDAP的username如果也跟gitlab的username一樣,有可能就會直接被gitlab系統連結起來。這時候如果LDAP server有更新,有可能會對這邊造成影響。

註2. LDAP連結錯誤

gitlab檢查openLDAP的時候,只會確認"該使用者有無在LDAP名單中"。假設該使用者從LDAP中除名,那gitlab就會自動把該員鎖起來。以我自身狀況來看,就是本來我在LDAP中註冊了一個測試帳號並使用了跟local端gitlab帳號一樣的email,LDAP就自動幫我連結過去。結果我測試完畢後就把該帳號從LDAP移除。Gitlab偵測到我移除後,就直接把我的帳號鎖起來。這時候如果要處理,要回到管理頁面。指令目前沒有看到有人分享處理辦法。





references:

https://docs.gitlab.com/ee/security/unlock_user.html

https://docs.gitlab.com/ee/security/reset_user_password.html

https://docs.gitlab.com/ee/security/reset_user_password.html#reset-the-root-password

https://gitlab.com/gitlab-org/gitlab-foss/-/issues/13179

2022年12月23日 星期五

使用Certbot完成Let'sencrypt SSL申請

首先要依照官網進行certbot安裝

certbot需要透過snap安裝,目前Ubuntu應該預設都有安裝。所以這邊直接跳到安裝Certbot:

sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo snap set certbot trust-plugin-with-root=ok

跟root掛完後,如果跟我一樣懶,是可以選擇使用外掛,或是參考別人的文章進行ACME挑戰。這邊紀錄使用cloudflare讓certbot自動幫我進行ACME挑戰:

sudo snap install certbot-dns-cloudflare

==========================================================

以上進行完畢後,就需要開始把Cloudflare上面的API key寫出來。這邊會需要製作一個.ini檔,讓certbot吃。假設該檔名為certbot.ini,內容應該如下:


# Cloudflare API credentials used by Certbot
dns_cloudflare_email = cloudflare@example.com
dns_cloudflare_api_key = 0123456789abcdef0123456789abcdef01234


其中dns_cloudflare_email就是在clouflare上面的帳號,底下api key可以到 https://dash.cloudflare.com/profile/api-tokens 這網頁底下,找出Global API key,在把內容貼上即可。但因為這邊的帳號密碼還有api key有點敏感,所以建議認證完畢後就把ini砍掉。

接著進行Cerbot認證,letsencrypt支援wildcard網域認證:

sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials ./certbot.ini -d *.markliou.tw

認證完畢後,就可以在 /etc/letsencrypt/live/markliou.tw底下找到認證檔。

基本上會用到的就兩個:

  • privkey.pem : 這就是privary key
  • fullchain.pem: 這是public key。因為letsencrypt會連同上面的一些server一起認證,所以內容會比較多。
把以上幾個key放到正確位置後就能開始運作。


Rerefernce:
  1. https://certbot.eff.org/instructions?ws=other&os=ubuntufocal
  2. https://certbot-dns-cloudflare.readthedocs.io/en/stable/#credentials
  3. https://blog.miniasp.com/post/2021/02/11/Create-SSL-TLS-certificates-from-LetsEncrypt-using-Certbot



2022年12月16日 星期五

Asana與gitlab的連動方式

 目前的Gitlab有開放跟Asana的聯動方式,但僅限於把特定任務進行completed checking。

  1. 到asana的console , 點下"create new token",把token存下來。請記得這個token只會出現一次,所以如果弄丟了就永遠看不到,到時就是回來重新申請。
  2. 到gitlab的頁面下,進入預計要進行連動的專案。到最左邊的Settings -> integrations,點擊Asana,並且將剛剛從Asana拿到的API token,大概會變成底下圖的樣子:



  3. 完成以後回到上面的頁面就可以看到Asana打勾了。



使用方式

推code的時候,在commit的欄位使用以下兩種方式:

  1. 把Asana的task號碼貼上。Asana的task號碼取得方式就是把asana打開後,有一個迴紋針圖樣點下去後就會copy一個link address,大概長這樣: https://app.asana.com/0/1203267114681956/1203488262458318/f  
    其中1203488262458318 (上面黑體字的標定位置)就是號碼。把號碼加上#放到commit comment裡面(#1203488262458318 ),Asana的task update底下就會自動加上該commit的連結。
  2. 可以把該連結直接放到commit comment裡面。只是看起來會比第一種方式不乾淨,但效果一樣。
如果想把Asana的項目直接打勾,可以用以下關鍵字(可參閱gitkab官網說明文件)

  • fix
  • fixed
  • fixes
  • fixing
  • close
  • closes
  • closed
  • closing



references:

  • https://docs.gitlab.com/ee/user/project/integrations/asana.html

2022年12月12日 星期一

Gitlab container版升級紀錄

寫在前面

Gitlab安裝的時候會有自動生成管理帳號,且在架設container的時候也會因為不同帳號而會有不同的管理與讀寫權限。因此如果要把A地的gitlab搬移到B地時,建議使用rsync連同整個資料夾的擁有者和權限都一起copy。用法是:

rsync -avp <origianl folder> <desc folder>



公司的Gitlab使用12.1.1-ce0使用了很久。準備要升級。

不過因為configure差異太多,沒辦法一步到位,所以必須要一版一版慢慢升上去。以下紀錄升版過程:


12.2.12-ce0

12.4.6-ce0

12.6.0--ce0

12.8.0-ce0

12.10.0-ce0

13.0.0-ce0

13.12.15-ce0

14.0.12-ce0

14.2.0-ce0

從14.2.0開始,在檔案系統有些許變革。所以需要進入到conainter裡面把檔案系統打開後再進行reconfigure(可參考: https://blog.csdn.net/OldDirverHelpMe/article/details/106536972 ),不然會卡在某個ruby_block的區段裡出不來。(後面有蠻多機會碰到這狀況的,但解法都一樣)

以下為參考指令:

sudo docker run -it -v `pwd`/config:/etc/gitlab -v `pwd`/data:/var/opt/gitlab gitlab/gitlab-ce:14.2.0-ce.0 bash
runsvdir-start &

gitlab-ctl reconfigure

升級成功後,再繼續往下走

14.3.1-ce.0

14.5.1-ce.0

14.7.1-ce.0

14.9.1-ce.0

14.9.5-ce.0

往14.10升級時會碰到migrate的問題,因此要進入14.10.2 的 container執行以下指令:

gitlab-rake  gitlab:background_migrations:finalize[ProjectNamespaces::BackfillProjectNamespaces,projects,id,'[null\,"up"]']

gitlab-ctl reconfigure

14.10.2-ce.0

14.10.5-ce.0

15.0.0-ce.0

15.2.0-ce.0

15.4.0-ce.0

15.6.2-ce.0

 

Gitlab 官方建議升級方式

可參考: https://gitlab-com.gitlab.io/support/toolbox/upgrade-path/




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

2022年2月14日 星期一

test article

 test article


\begin{equation} \frac{V_1kC_{A0}}{F_{A0}} = \int_0^{X_{A1}} \frac{dX_A}{1-X_A}=\frac{(100 \cdot L)(0.6 \cdot min^{-1})(5 \cdot mol \cdot L^{-1})}{100 \cdot mol \cdot min^{-1}} \end{equation}

test pic des





iscsi 連線問題筆記

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