我从StackOverflow迁移了这个问题。
我正在我们公司管理一个Gitlab-Omnibus (Community )实例,作为一项额外的职责。
Gitlab使用公司的Active服务器进行身份验证。我们的网络经理为新员工创建AD帐户,并在他们离开后将其删除。Gitlab通常在第一次登录时创建自己的用户帐户,并在AD帐户被删除后阻止他们登录尝试。
那么清洗那些"死魂“应该是非常容易的。
问题是:用户没有被封锁,在员工离开后,Gitlab帐户的状态仍然是“活动的”,因为离开后没有人尝试登录到Gitlab。服务器本身是无法从互联网上访问的,前雇员不能进入办公室,因为他们的通行证被销毁,他们的个人电脑被拆解或格式化了一个新的操作系统安装。
因此,我必须手动模拟每个帐户,并检查Gitlab是否阻止它(感谢Gitlab开发人员提供的模拟功能,至少我已经得到了一些东西)。
我想自动化这个过程,因为Gitlab中有超过100个用户帐户,而且我没有收到关于那些已经离开公司的员工的通知(我既不是人力资源经理,也不是sysadmin;我通常也不需要它们,因为有很多员工不需要Gitlab帐户)。
我的目标是开发一个脚本或Ruby片段,我可以将其粘贴到gitlab控制台。
这个片段应该扫描在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"。
发布于 2018-11-02 10:55:19
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()发布于 2019-04-01 12:29:15
如前所述,这里应该由gitlab:cleanup:block_removed_ldap_users rake任务来完成这项工作。我亲自尝试过,所有在AD中缺席的用户都在GitLab中被屏蔽。
发布于 2023-03-13 13:30:13
除了wl2776非常有用的答案之外,不需要调用"user.save()“方法。如文档中所示,当用户属性发生变化时,需要进行“示例 ()”调用。例如,这必须一起执行。
user.name = 'Real Name' user.save()
像user.block()和user.unblock()这样的函数可以直接应用。
https://serverfault.com/questions/934156
复制相似问题