Автоматически блокировать пользователей 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(), в свою очередь, применяются сразу.

Другие вопросы по тегам