0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PowerDNS権威サーバーをDockerで

Last updated at Posted at 2025-02-26

概要

この記事は、他記事を参考にDockerでPowerDNSとPowerDNS Adminを構成した時に、躓いたことをメモ書きにしたものである。

環境

参考記事

  1. PowerDNS + PowerDNS-Admin で Docker 上に権威 DNS サーバを構築する
  2. PowerDNSとPowerDNS Adminでローカルサーバの名前解決用DNSサーバを作ってみる
  3. PowerDNS の API 操作メモ

動機

Google検索で上位の方に出てきた上記記事を参考にDocker ComposeでPowerDNSとPowerDNS Adminを構成したのだが、上記の情報だけではスムーズに行かなかった点を補足程度にメモ書きに残し、多少でも後続の方々の参考になればと。

他の記事に既出の可能性もあるが、多数ある記事を網羅的に確認する手間が取れないのでご容赦を。

Dockerイメージの種類

最初はpdns-auth-masterを指定したのだが、alpha版のイメージになるようなので、バージョン4.9を指定した。

PowerDNS Adminは上記 1. ではngoduykhanh/powerdns-admin:v0.3.0のイメージを指定していたが、 2. で使われているpowerdnsadmin/pda-legacy:latestのイメージの方が公式っぽいので、そちらに変更した。

それにしても"legacy"とついていたり、1年前(2024年2月)が最終更新だったりと見捨てられた感が漂っており、今後には不安が残る。

ファイルのパーミッション

最初は、上記 1. の記事をほぼそのまま流用したのだが、エラーが出て起動直後に終了してしまった。結論としては.sqliteファイルにアクセス権がないのが原因だった。

.sqliteファイルに対してchmod 666をして改善した。

PowerDNSの設定が消える

PowerDNSでアカウント作成してログインし、DNSのzoneとrecordを設定したが、docker compose downするとPowerDNSの設定が全て消えてしまう。

調べると/var/lib/powerdns/pdns.sqliteがあるフォルダには他にもコンテナ起動時にファイルが作成され、zone設定などの情報はそちらに書き込まれている。

コンテナにファイルではなくフォルダをマウントするようにしたら改善した。フォルダのパーミッションを777にする必要があった。空のファイルを作成すればフォルダにまではパーミッションがいらないかもしれない。

このあたり上記 2. の記事はちゃんとしてはいるようだが、pdns.sqlite以外のファイル作成については明示的に書いていなかった。

実行ユーザー

PowerDNSのドキュメントにはsetuid, setgidでユーザーを変更することが推奨されている。

上記ファイルのパーミッション問題を解決しようと色々試したが、compose.yml側のuserpdns.conf内のsetuid, setgidを色々組み合わせて試したが、コンテナの既定値のuid, gid以外でコンテナを起動することは、権限の関係で読めないファイルに遭遇するのでできないようだった。

おそらくuid, gidはコンテナでは既に変更されているのでこれ以上の変更は必要ないということなのだろう。

パーミッションでo=7になっているのが気になっていたので、uid, gidの変更を諦めたことを受け、PowerDNSのフォルダはchown :953(953はコンテナ内のユーザーpdnsのid)、PowerDNS Adminのフォルダはchown :101(コンテナ内のpdaグループのid)した上で、chmod 770とすることで回避した。

IPアドレス

コンテナ同士はcompose.yml記載のサービス名があればIPアドレスで指定しなくてもアクセス可能だが、pdns.confwebserver-allow-from=を書いてアクセス許可をする必要があり、しかもIPアドレスでの指定しかできない設定だった。

このあたりを参考にIPアドレスを固定した。

ポート開放

PowerDNSの8081ポートはcompose.ymlexposeなどで開放しなくても他のコンテナからアクセス可能だった。

一方でPowerDNS Adminの方はポート開放が必要で、PowerDNS AdminにはIPアクセス制限機能がないため、ファイアウォールを設定する必要があった。

Dockerだとgufwとかが使えなくて面倒なので、設定しないときはコンテナを停止するとかだろうか。

API-Keyの分離

1.の記事では.envファイルに分離する方法をとっているが、.envに他に書くことがある場合は、/etc/powerdns/pdns.d/フォルダにpdns.conf以外に.confファイルを作りapi-key=を書いて設定することができる。

そういえば 1. の記事ではpdns.confapi=yes, webserver=yesの設定がない。PowerDNS AdminからはAPI経由で操作するから必要なはずだが。

PowerDNS Adminで追加ユーザー作成禁止

最初のユーザーをログイン欄の下になるCreate an accountから設定するのはわかったのだが、その後もCreate an accountが残り続けるのではログイン画面の意味がないのではと思った。

Authentication SettingsLocalタブでAllow users to sign upのチェックをオフにしてSave Settingsを押せば設定が反映され、ログイン画面からCreate an accountが消える。

余談だが、PowerDNS AdminはOTP Tokenを入力する欄があるが、無視できることを知らずに少し焦った。

PowerDNSのAPI

PowerDNSのREST APIリファレンスを見て、およそのことはわかるもののいざ使おうとすると具体的な事例がなくてわかりにくかった。たとえばPOSTする時にJSONを送信するのだが、JSONの詳細な書き方がリファレンスには書いていないし、GETで得られるJSONに近いものだろうとは思いつつも、当てずっぽうで改変してもうまくいかなかった。上記3.の記事から推測してかろうじてAPIの呼び出しに成功した。

改訂履歴(表現の修正などは除く)

  • 2025/2/23: 草稿
  • 2025/2/26: 初版
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?