Автоматически блокировать пользователей Gitlab, удаленных из LDAP
Я перенес этот вопрос из StackOverflow.
Я управляю экземпляром Gitlab-Omnibus (Community Edition) в нашей компании в качестве дополнительной обязанности.
Gitlab использует сервер Active Directory компании для аутентификации. Наши сетевые менеджеры создают учетные записи AD для новых сотрудников и удаляют их после ухода. Gitlab обычно создает свои собственные учетные записи пользователей при первом входе в систему и блокирует их при попытках входа после удаления учетной записи AD.
Тогда должно быть очень легко очистить эти " мертвые души".
Проблема в том, что пользователи не блокируются, статус учетной записи Gitlab остается "Активным" после ухода сотрудника, потому что никто не пытается войти в Gitlab после ухода. Сам сервер недоступен из Интернета, бывшие сотрудники не могут войти в офис, поскольку их карточки доступа уничтожены, их компьютеры разобраны или отформатированы с новой установкой ОС.
Итак, я должен вручную попытаться выдать себя за каждую учетную запись и проверить, не блокирует ли ее Gitlab (спасибо разработчикам Gitlab за функцию олицетворения, по крайней мере, что-то, что у меня есть).
Я хотел бы автоматизировать этот процесс, потому что в Gitlab более 100 учетных записей пользователей, и я не получаю уведомления о тех сотрудниках, которые покинули компанию (я не являюсь ни HR-менеджером, ни сисадмином; я также обычно не они не нужны, потому что многие сотрудники не требуют учетных записей Gitlab).
Моя цель - разработать скрипт или фрагмент Ruby, который я мог бы вставить в консоль gitlab-rails.
Этот фрагмент должен сканировать всех пользователей, зарегистрированных в 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"
3 ответа
Как уже упоминалось здесь gitlab:cleanup:block_removed_ldap_users
грабли задача должна сделать работу. Я лично попробовал это, и все отсутствующие у пользователей AD были заблокированы в GitLab.
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()
В дополнение к очень полезному ответу wl2776 нет необходимости вызывать метод user.save(). Как показано в примерах документации, вызов save() необходим при изменении атрибутов пользователя. Например, это должно выполняться вместе
user.name = 'Real Name'
user.save()
Такие функции, как user.block() и user.unblock(), в свою очередь, применяются сразу.