Windows Server の DNS に URI レコードを登録するコマンド

# WindowsServer2022 の DNS への URI レコードを登録作業

Powershell で Windows Server 2022 の DNS へ URI レコードを登録する作業について記載します。

## 注意事項
**初めに重要なので言っておきます。**

**私はDNS良く分かりません。**
**私はDNS良く分かりません。**

**ここで使われている用語については雰囲気で書いてます。**

それを踏まえて本編は以下の通りです。

## はじめに
Windows で DNS の URI レコード登録作業でハマったのでメモとして残します。
本家のコマンドの説明へのリンクは以下の通りです。

 - Adds a resource record of a specified type to a specified DNS zone.
   - [Add-DnsServerResourceRecord](https://learn.microsoft.com/en-us/powershell/module/dnsserver/add-dnsserverresourcerecord?view=windowsserver2022-ps)

しかし、上記の説明の中には URI レコードの登録についての example は記載されていません。

## 経緯
RHEL 標準の認証周りを提供するサービス FreeIPA (現在は Red Hat Identity Management) の検証時、FreeIPA で認証させたいサーバーは、Kerberos認証しているサーバーの SRV や URI の FQDN を解決する必要がありました。
Windowsを DNS サーバーとして利用する場合、URI レコードを登録する作業でハマったので記録として残しています。対応としては、RHELさんから出ているナレッジベースの情報が一番正しいと思われます。

 - RHEL の Knowledgebase の情報
   - [How to add IdM URI DNS Resource Record to Windows DNS server?](https://access.redhat.com/solutions/7004658)

![adddns3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54900/e3f85fa2-b615-662c-988a-4a2d1a17da96.png)

細かい認証周りの機構については、RHELさんの公式のマニュアルの[「第12章 IdM で SSSD を使用した認証のトラブルシューティング」](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/9/html/configuring_authentication_and_authorization_in_rhel/assembly_troubleshooting-authentication-with-sssd-in-idm_restricting-domains-for-pam-services-using-sssd)の項目に記載されています。ここでは FreeIPA(IdM) の認証の仕組みは説明しません。

## URI レコードとは？？？

2015年ぐらいに RFC 上は登録されたレコードの種類とのこと。
RFCのアブストラクトをみると「ホスト名からURIへのマッピングを公開するために使用されます。」と一言ありますが、何に使うか DNS 素人の私は良く分かりませんでした。

本当にごめんなさい。わかる人がいたらコメントをください。。。

 - RFC 7553
   - [The Uniform Resource Identifier (URI) DNS Resource Record](https://datatracker.ietf.org/doc/html/rfc7553) 

ここ数年は AWS の Route53 や、 OCI の DNS サービスで、雑にレコード登録をしており、オンプレは久々だったので、何ぞ？となっていました。ただ、FreeIPA(IdentityManagement) のインストール手順で、これらの FQDN の名前解決せよ！という指定があり、しぶしぶ DNS の設定をし始めました。

## やったこと

### 1. Linux 上で登録したい URI レコードを確認するコマンド

```ipa dns-update-system-records --dry-run``` で表示されたレコード一覧の情報を元に以下のコマンドを実施し、WindowsServer の DNS に登録するレコードの情報を取得します。（おそらく dig の Answer セクションで表示されてほしい内容の一覧が並びます）
注意事項になりますが、 named-rrchecker を利用するには bind をインストールする必要があります。

```
$ echo 'IN URI 0 100 "krb5srv:m:tcp:idm.example.com."' | named-rrchecker -u
CLASS1  TYPE256 \# 34 000000646B7262357372763A6D3A7463703A69646D2E6578616D706C652E636F6D2E
$
```

### 2. Windows の DNS に URI レコードを登録するコマンド

WindowsServer の Powershell を管理者権限で実行し、以下のコマンドを実施します。
```
 Add-DnsServerResourceRecord -ZoneName "idm.example.com" -Name "_kerberos" -Type 256 -RecordData "000000646B7262357372763A6D3A7463703A69646D2E6578616D706C652E636F6D2E"
```

![adddns1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54900/637f41ea-c8c0-c595-2e1c-bd1d4f3c03da.png)

WindowsServer上で以下のように表示されていれば成功です。
![adddns2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54900/f190f96d-77a1-ee91-90ac-c95acf09ae17.png)

### 3. Linux 上で登録された URI レコードを引いてみる


```
$ dig _kerberos.idm.example.com URI

; <<>> DiG 9.18.12-0ubuntu0.22.04.2-Ubuntu <<>> _kerberos.idm.example.com URI
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5636
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;_kerberos.idm.example.com.     IN      URI

;; ANSWER SECTION:
_kerberos.idm.example.com. 3600 IN      URI     0 100 "krb5srv:m:tcp:idm.example.com."

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Sun Aug 20 13:29:54 UTC 2023
;; MSG SIZE  rcvd: 100

$
```

## 色々、WindowsServerのDNSでハマった点

 - Add-DnsServerResourceRecord
   - URI レコードの登録時のみ、TTL, Priority, Weight のパラメータが利用できませんでした。Aレコード、PTRレコード、SRVレコードの追加のコマンドでは指定できました。
   - ```-Type``` のパラメータを  RHEL の Knowledgebase の情報では文字列型 ```"256"``` と指定していますが、マイクロソフトの公式の説明を見るとUInt16型となっています。  ```-Type 256``` でも登録作業はできました。
   - SRV レコードの登録時に、 tcp や udp の指定があると思いますが、その場合は ```-Name "_ldap._tcp"```のように指定することで意図した SRV レコード登録が可能になります。
  - Windows Server の DNS での URI レコードはサポートしてない状況でした。Windowsだけではなく、一般的ではないレコードの種類のように感じました。

## おわりに

 - DNS の構築について
   - WindowsServerでDNSを立てるより、FreeIPA(IdentityManagement)  付属の DNS サーバーを利用したほうが構築は楽になると思います。  
   - 既存の環境で WindowsServer の DNS を利用している人たち向けに書いてみました。
   - リゾルバや BIND の実装について気になるようになりました。
 - 久しぶりの RHEL について
   - いろいろ変わっていていいですね。nmcli いい！！（今更？）
   - SSSD(System Security Services Daemon) に感動を覚えました。
   - グローバル変数おじさんではなく、sysconfig 編集おじさんになるところでした。

## おまけ
調査中に使ったリンク集を張っておきます。
cloudflare さんの DNS の説明はすごく分かりやすくて良いなと思いました。

- CLOUDFLAREさんのDNSレコードについての説明です。  
  - https://www.cloudflare.com/ja-jp/learning/dns/dns-records/)
- DNS に関する RFC を一覧でまとめてくれている n-i-e さんの Qiita のページです。
  - https://qiita.com/n-i-e/items/482dee0706547dcc6a95
- 裏どりは必要ですが、英語版の Wikipadia にもレコードの種類がまとまっていて助かりました。
  - https://en.wikipedia.org/wiki/List_of_DNS_record_types
- AWS の Route53 でサポートされるレコード一覧
  - https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/ResourceRecordTypes.html