こんにちは。AWS を使っているとEC2 とかだとセキュリティグループでIP 制限をかけたりすると思います。ただサイトは全公開したいけど、一部の別のドメインとか管理画面だけは自社のIP にしたいだったりとか自宅のIP だけで見えるようにしたといった要望があると思います。
ただ、HTTPS ではなく、HTTP だと通信の際に暗号化できてないのはそれはそれでよくないよねーってなることもあると思います。一応公開してないので、大丈夫だろーーっていうこともあるかもしれませんが、サイバー攻撃が増えてきた昨今こういった穴もなるべく少なくしていきたいですね。
ということでSSL 証明証を導入しようと思うのですが、いざ調べてみるとSSL 証明証って案外高いんですよね。。。そこで活躍するのが、題名にも書いたLet’s encrypt です。Let’s encrypt を使うと無料でSSL 証明証を発行できるので、これは大変嬉しいです!!!
ただ、IP 制限をしていると更新ができないとか、そもそも発行しようとした時に403 forbidden が出てしまうので、IP 制限下でもLet’s encrypt が発行・更新できるように調整していきます!!
今回の環境
- Alma Linux 9
- Apache 2.4.X 系
- certbot (Let’s encrypt を発行するために必要です)
IP 制限ってそもそもどこでかけるべき??
IP 制限をかけるパターンって以下がよくあると思います
- セキュリティグループ
- firewalld
- .htaccess
- iptable (alma linux9 の場合はnftable)
- Apache
WAF などはお金が発生してしまうので除いていますが、大体このパターンになるのかななどと思っています。その中でクラウド側で設定するセキュリティグループでIP 制限を設定してしまうと柔軟にカスタマイズができないので、除きます。
firewalld とかiptable もHTTP からのアクセスをIP 単位で絞ることはできても確かパスとかによって変更するみたいな制限の仕方はなかった気がするので、これもまたまた除くことになります。となると残りは、、、
- Apache
- .htaccess
での設定が候補になります。
それぞれ検討していましょう。
.htaccess でのIP 制限でLet’s encrypt 更新できるようになる??
結論から言うと、僕の知っている範囲内ではできないと思います。
ディレクトリに対してアクセス制限などをする時にといった書き方をします。
<Directory /var/www/html >
</Directory>
or
<Location /var/www/html >
</Location>
or
<LocationMatch>
</LocationMatch>
.htaccess ではFilesMatch やFile といった特定のファイルなどに対しては制限を設けることができるのですが、上で書いたようなディレクティブの設定はできないようになっています。もし仮に書いたとしてもサイトの表示には問題なかった気がするのですが、ここではディレクティブの設定はできませんのようなエラーがerror.log に出力されます
(そもそも.htaccess はアクセスがあるたびに.htaccess を見に行くので負荷が上昇する可能性が高くあんまり推奨はされないやり方にもなります) 多分その理由でnginx とかはhtaccess採用していないのかなとも推測しています。
<FilesMatch "^¥.ht">
Order allow,deny
Deny from all
</FilesMatch>
Apache の公式ドキュメントもここに添付するので、興味がある方は是非見てみてください。
ここまで来た人は一目瞭然ですが、答えはApache でIP 制限をすることになります。
Apache でIP 制限、かつLet’s encrypt が更新できる状態に設定してみる
.htaccess も設定自体は難しく、かつ推奨されない設定なのでApache 側でIP制限の設定していきましょう。まずはどんな設定になるのか下に書いていきます。(色んなパターンがあると思いますが、二つくらい紹介します)
まずは一つ目の設定方法です
#ドキュメントルートのIP制限
<Directory "/var/www/html">
Order allow,deny
Deny from all
Allow from xxx.xxx.xxx.xxx
</Directory>
# Let's encrypt 更新用の設定
<Directory "/var/www/html/.well-known">
<RequireAll>
Require all granted
</RequireAll>
Require all granted の設定によって、IP制限などの影響を排除して全てのアクセスを許可するという設定をしています。こうすることによって、.well-known (=let’s encrypt の証明書を発行・更新する時に参照するディレクトリパス) はすべてのアクセスが通るようにしていますが、アクセスしてほしくない、ドキュメントルート配置しているサイト表示はIP 制限を実施しています。
1 の設定もallow from などで書いていますが、apache 2.4 からは require all denied で require not ip とかで制限をした方がいいのかもしれません。
二つ目の設定方法です
# well-known ディレクトリのみアクセス制限をかけない
<LocationMatch "^/(?!.well-known)">
Order deny,allow
Deny from all
Allow from xxx.xxx.xxx.xxx
</LocationMatch>
LocationMatch で、
- ?!.well-known は.well-known のパスは含まないを意味します
? の正規表現の意味は .well-known という文字列が含まれるときは、を意味します。それを否定しているので、.well-known の文字列を含まないディレクトリがLocationとMatch するということになります。要は、この文字列が含まれてない場合は、ディレクティブの中設定通りに動いてくださいっていう意味ですね。
その中身は、基本的に全部のIP からのアクセスはブロックして、例外にAllow from に記載されているIP のみアクセスを許可してくださいっていう意味になります。ちょっと直観的にはわかりずらい書き方になっていますね。。。
まとめ
上のやり方以外にももしかしたらLet’s encrypt 更新する上でIP 制限かけない書き方はあるかもしれませんが、Apache を使用しているときは上の書き方を参考にいただけると嬉しいです!!
個人的には直感的な1 番目に紹介した書き方が分かりやすくていいなと思いましたが、記述量的には2番目の方がいいのかなと思ったりしています。他にも別途conf ファイルを作成してIP 制限から逃げる書き方もあるかもしれません。色々試して、Apache に詳しくなっていきましょう!!
コメント