web-dev-qa-db-ja.com

LDAPから削除されたGitlabユーザーを自動的にブロックします

この質問をStackOverflowから移行しました。

追加の義務として、当社でGitlab-Omnibus(Community Edition)インスタンスを管理しています。

Gitlabは、会社のActiveDirectoryサーバーを認証に使用します。当社のネットワークマネージャーは、新入社員のADアカウントを作成し、退職後に削除します。 Gitlabは通常、最初のログイン時に独自のユーザーアカウントを作成し、ADアカウントが削除された後のサインイン試行時にそれらをブロックします。

そうすれば、それらの " dead souls "をきれいにするのはとても簡単なはずです。

問題は:ユーザーがブロックされておらず、従業員が退職した後もGitlabアカウントのステータスは「アクティブ」のままです。これは、誰もサインインしようとしないためです。去った後のGitlab。サーバー自体はインターネットからアクセスできません。パスカードが破壊されたり、PCが分解されたり、OSが新しくインストールされてフォーマットされたりするため、元従業員はオフィスに入ることができません。

そのため、手動で各アカウントの偽装を試み、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"を設定するために何をチェックするかを見つける時が来ました。

1
wl2776

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()
1
wl2776

前述のように ここgitlab:cleanup:block_removed_ldap_usersrakeタスクがその仕事をするはずです。私は個人的にそれを試しましたが、ADユーザーの不在はすべてGitLabでブロックされました。

1
Vertigo