本稿ではIPA試験で必要とされる知識をまとめます。
DNSレコードとは
DNSは,インターネット上でドメイン名を管理・運用するために開発されたシステムです。各ドメインで情報を管理するサーバは権威サーバと呼ばれ,権威サーバが管理するドメインの範囲をゾーンと呼びます。なお,権威サーバが複数存在する場合は,ゾーンの情報を各サーバで同期する必要があります。権威サーバは,ゾーンをDNSレコードと呼ばれるテーブルで管理しており,DNSレコードはゾーンファイルとも呼ばれます。
一般的に,DNSレコードは下記のようなカラムを持ち,各行はリソースレコードと呼ばれています。
NAME | TTL | CLASS | TYPE | RDATA |
---|---|---|---|---|
exmaple.jp. | 3600 | IN | A | 192.0.2.1 |
SOAレコードではRDATAに複数のデータを記述したり,MXレコードには例外的にPREFERENCEカラムが存在したりするなど,各レコードごとに少し差分はあります。
NAMEでは,各レコードで紐づけるドメイン名を記述します。TTLでは,リソースレコードの内容をサーバにキャッシュする期間を記述します。CLASSではリソースレコードのクラスを記述し,歴史的な背景からIN/CS/CH/HSが定義されていましたが,現在では一般的なインターネットを表すINしか使われていません。TYPEでは,リソースレコードのタイプを記述し,このカラムの値が各レコードでドメインに紐づける情報の種類を指定しています。RDATAでは,リソースレコードの実際の情報を記述します。なお,ドメイン名の最後にピリオド.
が付いているのは,ドメイン名の終端を表しています。「jp」と書かれていればjpよりも上位のドメインが存在することになりますが,「jp.」と書かれていれば「jp」で終わるドメインに対するレコードとなります。
以下では,DNSレコードのリソースタイプごとに,具体例を用いて実際の設定方法を確認していきます。
SOAレコード
NAME | TTL | class | type | RDATA |
---|---|---|---|---|
exmaple.jp. | 3600 | IN | SOA | ns1.exmaple.jp. root.example.jp. ( |
2023032701; SERIAL | ||||
3600; REFRESH | ||||
600; RETRY | ||||
604800; EXPIRE | ||||
600; MINIMUM TTL) |
DNSレコードの中では()
で囲われた部分は複数行として解釈され,;
以降はコメントとして解釈されます。
SOA(Start Of Authority)レコードでは,ゾーンの管理情報を記述します。RDATAには,下表の情報が紐づけられます。
MNAME | RNAME | SERIAL | REFRESH | RETRY | EXPIRE | MINIMUM TTL |
---|---|---|---|---|---|---|
ns1.exmaple.jp. | root.example.jp. | 2023032701 | 3600 | 600 | 604800 | 600 |
MNAMEでは,ゾーンを管理するプライマリサーバの名前を記述します。RNAMEでは管理責任者のメールアドレスを記述し,最初のピリオド.
はメールアドレスの@
を表します。SERIALでは,ゾーン情報の連番を記述します。REFRESH以降では,セカンダリサーバ側からプライマリサーバ側にゾーン情報の更新を確認する際に利用される情報を記述します。具体的には,REFRESHでは更新を確認する際の時間間隔,RETRYでは更新が失敗した際の再試行間隔,EXPIREでは更新が失敗した際に更新前のデータを利用できる最大時間,MINIMUM TTLでは当該ゾーンではNAMEレコードで指定したドメイン名が存在しないということを記述します。
MINIMUM TTLは通常のTTLと対比して,ネガティブキャッシュとも呼ばれています。
NSレコード
NAME | TTL | CLASS | TYPE | RDATA |
---|---|---|---|---|
exmaple.jp. | 3600 | IN | NS | ns1.exmaple.jp. |
exmaple.jp. | 3600 | IN | NS | ns2.exmaple.jp. |
NS(Name Server)レコードでは,当該ドメイン以下のドメインを管理する権威サーバのFQDNを記述します。権威サーバはNameサーバとも呼ばれるため,NSレコードといいます。なお,NSレコードにおいて下位の権威サーバにゾーンファイルの管理を任せることを,委任もしくは委譲と呼びます。委任を行う場合は,委任元のゾーンでRDATAに指定した権威サーバのNAMEに対し,同じく委任元でAレコードを記述する必要があります。なぜなら,当該ゾーンに問い合わせたリゾルバが,RDATAで指定した権威サーバに接続できなくなってしまうからです。同様に,委任先のゾーンでも,委任元と全く同等のNSレコードおよびAレコードを記述する必要があります。両者が一致していないと,意図しない誤動作につながる可能性があるため注意が必要です。
MXレコード
NAME | TTL | CLASS | TYPE | PREFERENCE | RDATA |
---|---|---|---|---|---|
exmaple.jp. | 3600 | IN | MX | 10 | mx1.exmaple.jp. |
exmaple.jp. | 3600 | IN | MX | 20 | mx2.exmaple.jp. |
MX(Mail eXchange)レコードでは,当該ドメインのメールサーバを記述します。PREFERENCEというカラムは,転送先のメールサーバの優先度を指定します。PREFERENCEは値が小さいほど優先度が高いことを表します。
SRVレコード
NAME | TTL | CLASS | TYPE | PRIORITY | WEIGHT | PORT | TARGET |
---|---|---|---|---|---|---|---|
_kerberos._tcp.example.jp. | 3600 | IN | SRV | 120 | 2 | 88 | ds1.exmaple.jp. |
SRV(Service)レコードでは,任意のサービスの情報を記述します。MXレコードでは,@
以降のドメイン名を持つSMTPサーバを記述しますが,SRVではメールサービス以外も記述でき,優先度・重みづけ・ポートの情報も記述できるという意味で,MXレコードの拡張と捉えることもできるでしょう。PRIORITYでは,他のSRVレコードとの優先度を記述します。WEIGHTはPRIORITYが同じときに参照されるカラムで,TARGETで指定するサーバの使用比率を記述します。PORTは,サービスを利用するときのポート番号を記述します。TARGETでは,サービスを行うサーバのFQDNを記述します。
Aレコード
NAME | TTL | CLASS | TYPE | RDATA |
---|---|---|---|---|
ns1.exmaple.jp. | 3600 | IN | A | 192.0.2.1 |
ns2.exmaple.jp. | 3600 | IN | A | 192.0.2.2 |
mx1.exmaple.jp. | 3600 | IN | A | 192.0.2.3 |
mx1.exmaple.jp. | 3600 | IN | A | 192.0.2.4 |
A(Address)レコードでは,当該ドメインのIPv4アドレスを記述します。同じドメインに対して複数のIPv4アドレスを設定すると,権威サーバはラウンドロビン方式で順番にIPv4アドレスを応答するため,負荷分散を実現することが可能です。
AAAAレコード
NAME | TTL | CLASS | TYPE | RDATA |
---|---|---|---|---|
ns1.exmaple.jp. | 3600 | IN | AAAA | 2001:db8::1 |
ns2.exmaple.jp. | 3600 | IN | AAAA | 2001:db8::2 |
mx1.exmaple.jp. | 3600 | IN | AAAA | 2001:db8::3 |
mx1.exmaple.jp. | 3600 | IN | AAAA | 2001:db8::4 |
AAAAレコードでは,当該ドメインのIPv6アドレスを記述します。Aレコード同様,同じドメインに対して複数のIPv6アドレスを設定すると,権威サーバはラウンドロビン方式で順番にIPv6アドレスを応答するため,負荷分散を実現することが可能です。
IPv4アドレスを指定するレコードがAでIPv6アドレスを指定するレコードがAAAAなのは,IPv6アドレスはIPアドレスの長さが128bitであり,32bitであるIPv4アドレスの4倍だからです。
PTRレコード
NAME | TTL | CLASS | TYPE | RDATA |
---|---|---|---|---|
1.2.0.192.in-addr.arpa. | 3600 | IN | PTR | ns1.exmaple.jp. |
PTR(Pointer)レコードでは,Aレコードとは逆に,IPアドレスに対するドメインを記述します。NAMEには,RDATAに記述されたドメインに対するIPアドレスを指定しますが,IPv4アドレスの場合は「8bitずつ逆順で記述した末尾にin-addr.arpa.を付けた」値を,IPv6アドレスの場合は「4bitずつ逆順で記述した末尾にip6.arpa.を付けた」値を記述します。IPアドレスが逆順になる点と,IPv6では4bitずつ逆順で記述する点に注意してください。なお,上の例ではNAMEが長くなってしまうため,IPv6の例は省略しています。
CNAMEレコード
NAME | TTL | CLASS | TYPE | RDATA |
---|---|---|---|---|
info.exmaple.jp. | 3600 | IN | CNAME | server.exmaple.jp. |
shop.exmaple.jp. | 3600 | IN | CNAME | server.exmaple.jp. |
CNAME(Canonical name)レコードでは,当該ドメインの正式名を記述します。RDATAに記述される値は,NAMEの標準ドメイン名と呼ぶこともあります。
CNAMEレコードには,最上位ドメインであるZone Apex(ネイキッドドメインとも呼ばれる)に対して設定できないという制約や,他のレコードと共存させられないという制約があります。後者に関しては,あるドメインに対してCNAMEレコードで標準名を指定してしまうと,AレコードやNSレコードまでを設定することができなくなってしまうことを意味しており,これはRFC1912に記載されています。また,CNAMEレコードで指定したNAMEに対するIPアドレスを得るためには,CNAMEレコードの応答を受け取った上で,その標準ドメイン名に対して再度Aレコードを問い合わせるという計二往復のリクエスト・レスポンスを行う必要があります。
これらの理由から,現在では代わりにALIASレコードが用いられる場合が多いです。ALIASレコードでは,標準名を返す前にDNSサーバ側でAレコードを問い合わせた結果を返すため,リクエスト・レスポンスの総数は一往復で済みます。ただし,ALIASレコードはRFCで標準化されていません。
TXTレコード
NAME | TTL | CLASS | TYPE | RDATA |
---|---|---|---|---|
exmaple.jp. | 3600 | IN | TXT | "v=spf1 +ip4:192.0.2.1/24 ~all" |
TXT(Text)レコードは汎用的に使用されるレコードタイプで,255オクテットまでの任意の値を複数保持することができます。具体的には,SPF(Sender Policy Framework)やDKIM(Domain Keys Identified Mail)でTXTレコードが活用されています。上の例では,SPFにspf1
というバージョンを用い,192.0.2.1/24
というipv4
アドレスを正常+
と判断し,それ以外~
の全てall
は不正メールとして判断されるが配信されるというルールを示しています。
RRSIGレコード
NAME | TTL | CLASS | TYPE | RDATA |
---|---|---|---|---|
ns1.exmaple.jp. | 3600 | IN | PRSIG | A 8 3 86400 2024... 2023... 28364 example.jp. NiVihYAI... |
RRSIG(Resource Record digital SIGnature)は,権威サーバが各リソースレコードに対する署名を記述するレコードです。なお,複数のリソースレコードをまとめたRRset(Resource Record set)を署名対象とすることも可能です。RDATAには,下表の情報が紐づけられます。
TYPE COVERED | ALGORITHM | LABELS | ORIGINAL TTL | EXPIRATION | INCEPTION | KEY TAG | SIGNER'S NAME | SIGNATURE |
---|---|---|---|---|---|---|---|---|
A | 8 | 3 | 86400 | 2024... | 2023... | 28364 | example.jp. | NiVihYAI... |
TYPE COVEREDでは,署名対象のリソースレコードのタイプを記述します。ALGORITHMでは,RFC5702で定義されているアルゴリズム番号を記述します。具体的には,SHA-256ベースのDNSSECのアルゴリズム番号である8を記述します。LABELSでは,ドメイン名のラベル数を記述します。ただし,ラベル数とは.
で区切られた区分けの数を表します。ORIGINAL TTLでは,署名対象のリソースレコードのTTLを記述します。ただし,RFC4304で定義されている通り,ORIGINAL TTLの値と署名対象のレコードのTTLの値は一致しなくてはなりません。EXPIRATIONは署名の有効期間の終了時刻,INCEPTIONは署名の有効期間の開始時刻を表します。KEY TAGは,署名に対応する公開鍵を記述したDNSKEYリソースレコードの鍵IDを記述します。SIGNER'S NAMEは,署名対象のRRsetのゾーン名を記述します。SIGNATUREには,Base64により符号化した署名を記述します。
DNSKEYレコード
NAME | TTL | CLASS | TYPE | RDATA |
---|---|---|---|---|
exmaple.jp. | 3600 | IN | DNSKEY | 256 3 8 AQPSKmyn... |
DNSKEYレコードでは,当該ゾーンの署名に用いられる秘密鍵に対応する公開鍵を記述します。通常,DNSKEYレコードにはKSK(Key Signing Key)に対応する公開鍵と,ZSK(Zone Signing Key)に対応する公開鍵の二種類が用いられます。KSKは「当該ゾーンの公開鍵に対して署名を行う秘密鍵」に対応する公開鍵であり,ZSKは「当該ゾーンの公開鍵以外のデータに対して署名,すなわちRRSIGのSIGNATUREを生成する秘密鍵」に対応する公開鍵のことを指します。一般に,公開鍵認証の仕組みでは鍵ペアを定期的に更新する必要があります。ZSKは各データに対するPRSIGのSIGNATUREを生成するため,新しいレコードが追加された際など,更新される回数が多いです。一方で,KSKはZSKに対して署名を行う際に参照されるだけですので,定期的なZSKの更新時のみに更新されます。KSKとZSKが分かれているのは,KSKをセキュリティ強度が強めな鍵ペアとして設定し,ZSKを比較的セキュリティ強度が弱めの鍵ペアとして設定することで,更新回数の少ないKSKでセキュリティを担保しつつ,更新回数の多いZSKで負荷を軽減させることができるからです。
RDATAには,下表の情報が紐づけられます。
FLAG | PROTOCOL | ALGORITHM | PUBLIC KEY |
---|---|---|---|
256 | 3 | 8 | QPSKmyn... |
FLAGでは,この公開鍵がKSKであるのかZSKであるのかを記述します。具体的には, ZSKであれば256を,KSKであれば257を記述します。PROTOCOLでは,プロトコル番号を指定します。DNSKEYはDNSSECというプロトコルで利用されるため,DNSSECのプロトコル番号である3を記述します。ALGORITHMでは,RFC5702で定義されているアルゴリズム番号を記述します。具体的には,SHA-256ベースのDNSSECのアルゴリズム番号である8を記述します。PUBLIC KEYでは,Base64で符号化した公開鍵を記述します。
DSレコード
NAME | TTL | CLASS | TYPE | RDATA |
---|---|---|---|---|
exmaple.jp. | 3600 | IN | DS | 40636 8 2 K9HEU... |
DS(Delegation Signer)レコードでは,子ゾーンのDNSKEYリソースレコードから生成されたハッシュ値を記述します。DNSSECでは,あるゾーンのDNSKEYレコードにおけるKSKの正当性を,親ゾーンのDSレコードによって検証します。具体的には,KSKの正当性が親ゾーンへと継承されていき,最終的にはルートサーバの一覧であるルートヒントの正当性の検証に行き着きます。各DNSサーバでは,ルートヒントそれぞれのDNSKEYのRRSIGレコードが登録されていますので,最初のゾーンにおけるKSKの正当性を検証することができます。
このように,DSレコードの検証は階層的に引き継ぐことができ,このことを信頼の連鎖と呼びます。
RDATAには,下表の情報が紐づけられます。
KEY TAG | ALGORITHM | DIGEST TYPE | DIGEST |
---|---|---|---|
40636 | 8 | 2 | K9HEU... |
KEY TAGでは,子ゾーンのDNSKEYリソースレコードのIDを記述します。ALGORITHMでは,RFC5702で定義されているアルゴリズム番号を記述します。具体的には,SHA-256ベースのDNSSECのアルゴリズム番号である8を記述します。DIGEST TYPEではDIGESTを生成するためのアルゴリズムを記述し,2はSHA-256を表します。DIGESTでは,子ゾーンの当該ドメイン名と参照先のDNSKEYリソースレコードかDIGEST TYPEで指定されたアルゴリズムに基づいて生成されたダイジェストを表します。DIGESTは子ゾーンの当該ドメインの公開鍵と捉えると分かりやすいです。
コメント