Ldap

自動阻止 Gitlab 使用者,從 LDAP 中刪除

  • April 1, 2019

我已經從 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()

引用自:https://serverfault.com/questions/934156