自動阻止 Gitlab 使用者,從 LDAP 中刪除
我已經從 StackOverflow 遷移了這個問題。
我在我們公司管理一個 Gitlab-Omnibus(社區版)實例作為額外的職責。
Gitlab 使用公司的 Active Directory 伺服器進行身份驗證。我們的網路管理員為新員工創建 AD 帳戶,並在他們離開後將其刪除。Gitlab 通常會在首次登錄時創建自己的使用者帳戶,並在刪除 AD 帳戶後在嘗試登錄時阻止它們。
那麼清理那些“死靈”應該很容易了。
問題是:使用者沒有被阻止,員工離開後 Gitlab 帳戶的狀態仍然是“活動”,因為沒有人在離開後嘗試登錄 Gitlab。伺服器本身無法從 Internet 訪問,前員工無法進入辦公室,因為他們的通行卡被破壞,他們的 PC 被拆卸或格式化,安裝了全新的作業系統。
因此,我必須手動嘗試模擬每個帳戶並檢查 Gitlab 是否阻止它(感謝 Gitlab 開發人員提供的模擬功能,至少我已經擁有了一些東西)。
我想自動化這個過程,因為 Gitlab 中有超過 100 個使用者帳戶,而且我沒有收到關於那些離開公司的員工的通知(我既不是人力資源經理,也不是系統管理員;我通常也不會)不需要它們,因為有很多員工不需要 Gitlab 帳戶)。
我的目標是開發一個可以粘貼到 gitlab-rails 控制台的腳本或 Ruby 程式碼片段。
這個片段應該掃描所有在 Gitlab 中註冊的使用者,檢查他們在 LDAP 中的存在並阻止所有在 LDAP 中失去的使用者。
然後我會審查所有被屏蔽的使用者,將他們的個人項目轉移給他們的主管並刪除他們。
問題是我完全不熟悉 Ruby,也不熟悉 Gitlab 內部。
有什麼幫助嗎?
我願意:
irb(main):039:0> User.all => #<ActiveRecord::Relation [#<User id:98 @n.name>, #<User id:86 @n.name2>, ...]>
但:
irb(main):040:0> for u in User.all do irb(main):041:1* puts u irb(main):042:1> done irb(main):043:1> irb(main):044:1* ^C irb(main):044:0>
沒有輸出。
我究竟做錯了什麼?
更新
正確的循環語法應該是這樣的:
User.all.each { |u| puts u.name }
現在是時候等待某人離開並找到要檢查的設置
u.state = "ldap_blocked"
Python-gitlab結合https://ldap3.readthedocs.io/解決問題
這是程式碼:
import time from ldap3 import Server, Connection import gitlab GITLAB_SERVER = 'https://gitlab.example.com' LDAP_SERVER = 'ldap.example.com' no_block = {'root', 'ghost', 'other_custom_user'} def main(): gl = gitlab.Gitlab(GITLAB_SERVER, private_token='') server = Server(LDAP_SERVER) conn = Connection(server, user='CN=Bind User,CN=Users,DC=example,DC=com', password='highly_secret_password') conn.bind() users = gl.users.list(all=True) gitlab_users = {u.attributes['username']: u for u in users} ldap_filter = '(&(objectclass=person)(|' + ''.join(['(samaccountname='+u+')' for u in gitlab_users.keys()]) + '))' print(conn.search('DC=example,DC=com', ldap_filter, attributes=['cn', 'samaccountname'])) ldap_users = {str(u.sAMAccountName) for u in conn.entries} to_block = set(gitlab_users.keys()).difference(ldap_users).difference(no_block) print("Following users will be blocked: {}".format(to_block)) print("Waiting 10 seconds, then block") time.sleep(10) for u in to_block: user = gitlab_users[u] user.block() user.save() if __name__ == '__main__': main()