作成者別アーカイブ: shota

Let’s Encryptの無料SSL証明書で常時HTTPS化

会社でLet’s Encryptというものを教えてもらった(というか、お前が試せって感じだけど)ので、うちのFreeBSD+Apache2.2なサーバーに導入してみた記録。例によってこの記録は個人的なものであり、本記録を真似・参考にされるなどした際に問題が起きても当方はいかなる責任も負わない。

追記(2016/07/01)

Let’s Encryptコマンド(Let’s Encryptクライアント)の名称がCertbotクライアントとなり、FreeBSDのパッケージ名、コマンド名も変更となった。変更点は下記の通り。

パッケージ名

py27-letsencrypt から py27-certbot に変更された。パッケージは一度削除してインストールした。

# pkg delete py27-letsencrypt
# pkg install py27-certbot

コマンド名

/usr/local/bin/letsencrypt から /usr/local/bin/certbot に変更になった。

環境

  • FreeBSD 10.3-RELEASE
  • Apache 2.2系
  • 既にhttpで使っているサイトを対象に導入する。

FreeBSD用のCertbotクライアントのパッケージの導入

pkgで導入可能。

# pkg install py27-certbot

証明書の発行

certbotコマンドにcertonlyとつけて実行する。証明書の発行のみ行われる。

# certbot certonly --webroot -w [DocumentRootのパス] -d [ドメイン名] -m [メールアドレス] --agree-tos

ドメイン名へのアクセスチェックが行われるため、DocumentRootに一時的なファイルなどが作成され、letsencryptのサーバーから一時的なファイルへのアクセスが行われる模様。要アクセス権限。

/usr/local/etc/letsencrypt/live/[ドメイン名] 以下に証明書のファイルが生成される。シンボリックリンクになっていて、更新の度にリンク先が新しいファイルになるが、常にこのパスで参照できる。

プラグインが対応しているapache2.4系などは自動的に設定までしてくれるそうだが、apache2.4の環境で試してみたけど使い方がよくわからず、おとなしく証明書の発行を行って、設定は自分で行った。

証明書のインストール

apacheのVirtualHost設定等に下記を設定する。

  • SSLCertificateFile:cert.pem
  • SSLCertificateKeyFile:privkey.pem
  • SSLCertificateChainFile:chain.pem

apacheを再起動してhttpsでのアクセスを確認する。

証明書の更新

よくあるSSL証明書は有効期限が1年などの単位になっているが、この証明書の有効期限は3カ月なので、定期的に更新が必要。

# certbot certonly [DocumentRootのパス] -d [ドメイン名] -m [メールアドレス] --renew-by-default

証明書の発行にも書いたとおり、証明書へのパスの変更はないので、更新が済んだらapacheの再起動でOK。cronで毎月1日に更新するよう設定して様子見中。

httpでのアクセスをhttpsに強制リダイレクト

お手軽に.htaccessにて実施。WordPressのサイトの場合、「BEGIN WordPress」の前に書き加えた。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</IfModule>

mod_rewriteには明るくないが、同じ.htaccess内にRewriteEngine onが2行あっても問題ないらしい。

1つのIPアドレスで、複数のHTTPSサイトを運用する際の注意点

当サーバーの様にIPアドレスの割り当てが1つしかなく、名前ベースのバーチャルホストでHTTPS対応をしようとするとServer Name Indicationの利用が必要となる。サーバー、クライアントの双方て対応が必要だが、当サイトのサーバー(Apache 2.2系)は対応している。

クライアント側は、Windows XP以前のInternet Explorerなどで非対応となっているが、現時点でサポート継続中なOS・ブラウザではそれ程問題ない様に思われる。そのため、当ドメインも常時HTTPS強制としてみた。Windows XPなどを使っている人はせめてWindows 7あたりに更新を。

nsdでDNSサーバー(セカンダリーサーバー編)

(プライマリーサーバー編)

流行りにのってbindを捨ててみた記録。例によってこの記録は個人的なものであり、本記録を真似・参考にされるなどした際に問題が起きても当方はいかなる責任も負わない。

環境

  • FreeBSD 9.2-STABLE r258412
  • nsd-4.0.0
  • /usr/local/etc/nsd 以下に設定ファイル等を設置し、/usr/local/etc/nsdにchrootして利用する。(ログだけは/var/log)
  • 各ドメイン(ゾーン)は動的に追加する。(静的にconfigファイル内に記述は行わない)

nsdのインストール

portsを利用する

# portinstall dns/nsd

nsdユーザー / nsdグループ作成

nsdを動作させるユーザーにする。uidとgidは、sendmail(25)に対してFreeBSD portsからpostfixをインストールした際に作成されるユーザー:postfixが125という感じで、bind(53)に対して153を指定した。(既にuid, gidで153を使っている場合は変更すること)

# pw groupadd -g 153 -n nsd
# pw useradd -u 153 -n nsd -g nsd -c "nsd Sandbox" -d / -s /usr/sbin/nologin

nsd-controlを使うための準備

rndcのnsd版の様なもの。鍵の作成などが行われる様だ。

# nsd-control-setup

nsdの設定

/usr/local/etc/nsd/nsd.conf

server:
	username: nsd
	chroot: "/usr/local/etc/nsd"
	zonesdir: "/usr/local/etc/nsd/zones"
	zonelistfile: "/usr/local/etc/nsd/zone.list"
	database: "/usr/local/etc/nsd/nsd.db"
	logfile: "/var/log/nsd.log"
	pidfile: "/usr/local/etc/nsd/nsd.pid"
	xfrdfile: "/usr/local/etc/nsd/xfrd.state"
	xfrdir: "/usr/local/etc/nsd/tmp"
	hide-version: yes

remote-control:
	control-enable: yes
	control-interface: 127.0.0.1
	control-port: 8952
	server-key-file: "/usr/local/etc/nsd/nsd_server.key"
	server-cert-file: "/usr/local/etc/nsd/nsd_server.pem"
	control-key-file: "/usr/local/etc/nsd/nsd_control.key"
	control-cert-file: "/usr/local/etc/nsd/nsd_control.pem"

pattern:
	name: "slavezone"
	zonefile: "%s.zone"
	allow-notify: (プライマリーDNSサーバーのIPアドレス) NOKEY
	request-xfr: (プライマリーDNSサーバーのIPアドレス) NOKEY
	allow-axfr-fallback: yes

serverセクション:主に全体の設定

username
nsdを動作させるユーザー名。最初に作ったnsdユーザーを利用
chroot
chrootするディレクトリを指定する。chroot指定の場合、pidfile, database で指定した項目はchroot先ディレクトリ配下に設置の事。
zonesdir
zoneファイルの保存場所
zonelistfile
動的に追加されたゾーン情報リスト
database
データベース、どうやらzoneファイル等の内容はDB化されてnsdから利用される模様、chrootする場合はchroot先配下を指定の事
logfile
ログファイル
pidfile
プロセスIDが記録されたファイル、chrootする場合はchroot先配下を指定の事
xfrdfile
ゾーン転送に必要なファイル、らしい
xfrdir
ゾーン転送処理に使われるディレクトリ、らしい
hide-version
バージョン情報の応答を行わない様にする(隠す)場合はyes

remote-controlセクション:nsd-controlによるリモートコントロールの設定

control-enable
リモートコントロールを有効にする場合はyes
control-interface
リモートコントロールを待ち受けるためにnsdが待ち受けるIPアドレスを指定する、ここでは127.0.0.1を指定しているが、デフォルト値も127.0.0.1。
control-port
リモートコントロールを待ち受けるためにnsdが待ち受けるポート番号を指定する、ここでは8952を指定しているが、デフォルト値も8952。
server-key-file
server-cert-file
nsd-control-setupによって生成される、サーバーのプライベート鍵と自己署名証明書のパス
control-key-file
control-cert-file
nsd-control-setupによって生成される、リモートコントロールクライアントのプライベート鍵と自己署名証明書のパス

patternセクション:パターンマッチしたゾーンに一括でオプション設定する

name
パターン名、ここで指定したパターン名に対してダイナミックにドメイン追加や削除ができる
zonefile
ゾーンファイルのパス指定、%sはドメイン名に置き換わる(セカンダリー運用だと使わない?)
allow-notify
指定されたIPアドレスからの更新通知の許可設定、ここではプライマリーDNSサーバーのIPアドレスを許可する
request-xfr
指定されたIPアドレスにゾーン転送要求する
allow-axfr-fallback
yesの場合、ゾーン転送時プライマリーサーバーがIXFR(差分転送)に対応してなければAXFR(全文転送)にフォールバックすることを許可する

細かい設定は日本Unboundユーザー会が提供しているnsd.conf(5)の日本語マニュアルも参照の事。
nsd.conf(5) | 日本Unboundユーザー会

必要なディレクトリ、ファイルの作成とchown

# cd /usr/local/etc/nsd
# mkdir zones tmp
# chown -R nsd:nsd /usr/local/etc/nsd
# touch /var/log/nsd.log
# chown nsd:nsd /var/log/nsd.log

起動

# vi /etc/rc.conf
---
nsd_enable="YES"
---
# service nsd start

ドメイン追加

# nsd-control addzone (ドメイン名) slavezone

以下ドメイン分繰り返し。

nsdでDNSサーバー(プライマリーサーバー編)

(セカンダリーサーバー編)

流行りにのってbindを捨ててみた記録。例によってこの記録は個人的なものであり、本記録を真似・参考にされるなどした際に問題が起きても当方はいかなる責任も負わない。

環境

  • FreeBSD 9.2-STABLE r258412
  • nsd-4.0.0
  • /usr/local/etc/nsd 以下に設定ファイルやゾーンファイルを設置し、/usr/local/etc/nsdにchrootして利用する。(ログだけは/var/log)
  • 各ドメイン(ゾーン)は動的に追加する。(静的にconfigファイル内に記述は行わない)

nsdのインストール

portsを利用する

# portinstall dns/nsd

nsdユーザー / nsdグループ作成

nsdを動作させるユーザーにする。uidとgidは、sendmail(25)に対してFreeBSD portsからpostfixをインストールした際に作成されるユーザー:postfixが125という感じで、bind(53)に対して153を指定した。(既にuid, gidで153を使っている場合は変更すること)

# pw groupadd -g 153 -n nsd
# pw useradd -u 153 -n nsd -g nsd -c "nsd Sandbox" -d / -s /usr/sbin/nologin

nsd-controlを使うための準備

rndcのnsd版の様なもの。鍵の作成などが行われる様だ。

# nsd-control-setup

nsdの設定

/usr/local/etc/nsd/nsd.conf

server:
	username: nsd
	chroot: "/usr/local/etc/nsd"
	zonesdir: "/usr/local/etc/nsd/zones"
	zonelistfile: "/usr/local/etc/nsd/zone.list"
	database: "/usr/local/etc/nsd/nsd.db"
	logfile: "/var/log/nsd.log"
	pidfile: "/usr/local/etc/nsd/nsd.pid"
	xfrdfile: "/usr/local/etc/nsd/xfrd.state"
	xfrdir: "/usr/local/etc/nsd/tmp"
	hide-version: yes

remote-control:
	control-enable: yes
	control-interface: 127.0.0.1
	control-port: 8952
	server-key-file: "/usr/local/etc/nsd/nsd_server.key"
	server-cert-file: "/usr/local/etc/nsd/nsd_server.pem"
	control-key-file: "/usr/local/etc/nsd/nsd_control.key"
	control-cert-file: "/usr/local/etc/nsd/nsd_control.pem"

pattern:
	name: "masterzone"
	zonefile: "%s.zone"
	notify: (セカンダリーDNSサーバーのIPアドレス) NOKEY
	notify-retry: 5
	provide-xfr: (セカンダリーDNSサーバーのIPアドレス) NOKEY

serverセクション:主に全体の設定

username
nsdを動作させるユーザー名。最初に作ったnsdユーザーを利用
chroot
chrootするディレクトリを指定する。chroot指定の場合、pidfile, database で指定した項目はchroot先ディレクトリ配下に設置の事。
zonesdir
zoneファイルの保存場所
zonelistfile
動的に追加されたゾーン情報リスト
database
データベース、どうやらzoneファイル等の内容はDB化されてnsdから利用される模様、chrootする場合はchroot先配下を指定の事
logfile
ログファイル
pidfile
プロセスIDが記録されたファイル、chrootする場合はchroot先配下を指定の事
xfrdfile
ゾーン転送に必要なファイル、らしい
xfrdir
ゾーン転送処理に使われるディレクトリ、らしい
hide-version
バージョン情報の応答を行わない様にする(隠す)場合はyes

remote-controlセクション:nsd-controlによるリモートコントロールの設定

control-enable
リモートコントロールを有効にする場合はyes
control-interface
リモートコントロールを待ち受けるためにnsdが待ち受けるIPアドレスを指定する、ここでは127.0.0.1を指定しているが、デフォルト値も127.0.0.1。
control-port
リモートコントロールを待ち受けるためにnsdが待ち受けるポート番号を指定する、ここでは8952を指定しているが、デフォルト値も8952。
server-key-file
server-cert-file
nsd-control-setupによって生成される、サーバーのプライベート鍵と自己署名証明書のパス
control-key-file
control-cert-file
nsd-control-setupによって生成される、リモートコントロールクライアントのプライベート鍵と自己署名証明書のパス

patternセクション:パターンマッチしたゾーンに一括でオプション設定する

name
パターン名、ここで指定したパターン名に対してダイナミックにドメイン追加や削除ができる
zonefile
ゾーンファイルのパス指定、%sはドメイン名に置き換わる
notify
ゾーン情報の更新を通知するサーバーのIPアドレスを指定する。ここではセカンダリーDNSサーバーのIPアドレスを指定する。セカンダリーサーバーを使わない場合は不要
notify-retry
更新通知のリトライ回数指定
provide-xfr
指定したIPアドレスへのゾーン転送の可否を指定するリスト。ここではセカンダリーDNSサーバーのIPアドレスを指定する

細かい設定は日本Unboundユーザー会が提供しているnsd.conf(5)の日本語マニュアルも参照の事。
nsd.conf(5) | 日本Unboundユーザー会

必要なディレクトリ、ファイルの作成とchown

# cd /usr/local/etc/nsd
# mkdir zones tmp
# chown -R nsd:nsd /usr/local/etc/nsd
# touch /var/log/nsd.log
# chown nsd:nsd /var/log/nsd.log

ゾーンファイルの準備

zonesdirで指定した/usr/local/etc/nsd/zones 以下に「ドメイン名.zone」(例:example.jpの場合 example.jp.zone)を用意する。bindのゾーンファイルがそのまま利用できた。

起動

# vi /etc/rc.conf
---
nsd_enable="YES"
---
# service nsd start

ドメイン追加

# nsd-control addzone (ドメイン名) masterzone

以下ドメイン分繰り返し。

ゾーンファイルを更新した場合

SOAレコード等も更新した上で

# nsd-control reload (ドメイン名)