ActiveDirectoryにSSH公開鍵の属性を追加 ＋ GiteaのLDAP認証時にSSHキーを自動で登録する

# はじめに
先日作成した **[Giteaを利用したCI/CDサンプル](https://qiita.com/bashaway/items/16ef713fdbd30ecbcab8)** で、手動でSSH公開鍵を登録するのが面倒だったので、ActiveDirectoryにSSH公開鍵も登録して、LDAP認証させることにしました。

自分の環境では結構レアな作業だったので、備忘録として残します。
やってることは **[参考URL](https://blog.laslabs.com/2016/08/storing-ssh-keys-in-active-directory/)** とほぼ同一ですの。

# 対象機器および環境

## 検証環境
* Windows Server 2019
* CentOS8 (8.2.2004)
* Gitea (1.13.0+dev)


# 作業内容

今回の作業では「ActiveDirectoryスキーマの追加」を行います。
作業中に警告ダイアログが出る通り、追加されたスキーマオブジェクトは削除ができませんので、その点にご注意ください。

## 「ActiceDirectoryスキーマの編集」ができるようにする
コマンドプロンプトを管理者権限で立ち上げて `regsvr32 schmmgmt.dll` と入力する。
すると、スナップインにADスキーマの編集が選択できるようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/1dc2aa78-1ca7-a99e-65f8-089a023ac934.png)

で、同じく管理者権限のコマンドプロンプトで`mmc`して管理コンソールを立ち上げる。
すると、スナップインの追加と削除のメニューからActiveDirectoryスキーマが選択できるようになるので、これを追加して「OK」する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/12af3c53-6538-ed51-f7db-f205dacd32b7.png)

## 属性の作成

「属性」を右クリック→「属性の作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/d38130e1-fe97-07da-4122-c51ea4826681.png)

この確認画面が出るので、「続行」する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/6ff75c73-4e30-19fa-9ec7-76c6d23048ec.png)

一般名：sshPublicKeys
OID：1.3.6.1.4.1.24552.1.1.1.13
構文：IA5-String
複数値：チェックあり
で、作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/82d16be4-10b4-2eaf-258c-d62560859aaa.png)

## クラスの作成

「クラス」を右クリック→「クラスの作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/ea5dbebc-81cb-f621-cc50-13642a030419.png)

この確認画面が出るので、「続行」する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/afed3556-dd43-b1f4-ae40-3363c9d5a1a4.png)

一般名：ldapPublicKey
OID：1.3.6.1.4.1.24552.500.1.1.2.0
親クラス：top
クラスの種類：補助型
で、「次へ」する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/fff39d8a-0dd5-b439-21de-f7ad0a6840b7.png)

「オプション」に先ほど作成した sshPubnlicKeys を追加して「完了」する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/d278485a-9f0c-aa50-8c48-067b947b4424.png)

## ユーザクラスに紐づけ

「クラス」→「user」を選択してダブルクリックorプロパティを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/c1574235-7a41-1972-1ca4-4b4e13048895.png)

「関係」タブをクリックして、補助型クラスの「クラスの追加」から
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/851a8235-b010-e368-d506-a8a9598a6be5.png)

「ldapPublicKey」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/0b0371fb-2f64-e855-bb3b-ef47271ca98d.png)

こうなったら「適用」→「OK」する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/2bca82ac-8b80-9541-c70b-ca5938616b9e.png)

## ユーザの公開鍵を登録

管理ツールの「ActiveDirectoryユーザとコンピュータ」の「表示」→「拡張機能」にチェックをいれておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/062dc6ea-0ad3-8305-88a1-df87b61f7bcc.png)

ユーザをダブルクリック or プロパティを開いて、「属性エディタ」タブの「sshPublicKeys」を編集
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/575f8a19-c502-64bd-6f80-cf39f02dfe6d.png)

こんな感じで登録しておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/4fe729df-d188-18c3-fbd0-b7083a396ff9.png)

登録されていればこうなる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/676575cd-1792-bc6a-054c-3d2f42095774.png)

## GiteaでLDAP認証の設定をする

管理権限のあるユーザでログインして、「サイト管理」→「認証ソース」から「認証ソースを追加」を選択
認証タイプ：LDAP (via BindDN)
認証名：任意
セキュリティプロトコル：LDAPS
ホスト：ActiveDirectoryのサーバ
ポート：636（変更している場合はLDAPSのリッスンポート）
バインドDN：CN=検索用ユーザ,CN=Users,DC=prosper2,DC=net
バインドパスワード：（上記DNのパスワード）
ユーザ検索ベース：dc=prosper2,dc=net
ユーザフィルタ：(&(objectclass=person)(sAMAccountName=%s))
メールアドレス：userPrincipalName
SSH公開鍵：sshPublicKeys
（そのほか、特定グループは管理者権限を付与、とかあれば、Adminフィルタに入れるとよいと思います。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/d77a3e59-bc9b-bb40-240b-145628d255b6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/938933f2-8cbd-ad88-85fe-a3a8dce445d3.png)

## Giteaでログインしてみる
ADに登録しているユーザでログインする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/5c701cb7-81dc-80f3-7f0a-236423368a8d.png)

「設定」→「SSH/GPGキー」を見てみると、先ほど登録した公開鍵がすでに登録された状態となっている。
このとき、別のユーザで同一の公開鍵がすでに登録されている場合は登録されません。
Giteaとして一つの公開鍵は一つのユーザにしか紐づけられないためです。（逆に一つのユーザに複数の鍵はOKです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/44731c1c-d589-9a6b-6087-6fbea95a99e8.png)

あらかじめ公開鍵を２つ登録しておけば、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/b3f50438-44c4-91a4-3234-e0a451dfe160.png)

最初のログイン時（アカウント自動生成時）に鍵が２つ自動的に登録された状態になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/c286160b-3dca-ff59-63c0-735650b12c32.png)

おしまい

# 参考
https://blog.laslabs.com/2016/08/storing-ssh-keys-in-active-directory/