Webブラウザがブラウザというより環境って感じになってきた昨今、いかがお過ごしでしょうか。
何でもかんでもWebサービスでまかなえすぎて、ぼちぼちブラウザのセキュリティが一番のリスクになってきてますね😇
セキュリティやネットワークの試験でもUTMや認証付きProxyが当たり前に導入されてますし、私しかいない自室のセキュリティといえど負けてられないと自室のサーバに認証付きProxyをいれることにしました。
お前は一体何と戦っているんだ?_(:3」∠)_
Proxyの認証には前回までで入れたKerberos認証を使います。
認証付きProxyを導入するに当たって一番嫌だったのが認証によるWebアクセスへの一手間だったんですよねー。Kerberos導入でそこが改善できることになったので、じゃぁProxy認証を導入してみようと。
Proxyサーバ向けプリンシパルの登録
KerberosがProxyにチケットを発行できるようKerberosのDBにProxyが動いているホストを登録します。
Proxy用のプリンシパルはHTTP/minipc.home@HOMEらしいです。
$ kadmin.local
kadmin.local: addprinc -randkey HTTP/minipc.home@HOME
Squid用にキータブを作成する
前回まではSSSDに認証を全てお任せしてたので、SSSDの実行者であるrootしかアクセスできない/etc/krb5.keytabにプリンシパルの登録をまとめてきました。
SquidはSSSDに丸投げはできないみたいでSquid自身(実行者squid)がkeytabにアクセスする必要があるため、Squid用のキータブファイルを別に用意します。
$ kadmin.local
kadmin.local: ktadd -k /etc/squid/squid.keytab HTTP/minipc.home@HOME
kadmin.local: quit
$ chown squid:squid /etc/squid/squid.keytab
squid.confを修正する
kerberos認証を使うようにsquid.confを書き換えます。
上から順番にチェックして一致したらそこで確定という手順なので、Kerberos認証のallowより前に別のallowやdenyがマッチしたらKerberos認証が行われません。順番が大切です。
# Kerberos認証との連携
auth_param negotiate program /usr/lib64/squid/negotiate_kerberos_auth -k /etc/squid/squid.keytab -s HTTP/minipc.home@HOME
acl auth_users proxy_auth REQUIRED
http_access allow auth_users
# localnetの無条件allowを停止する
# http_access allow localnet
Squidを再起動すればKerberos認証が通らない場合407を返すようになります。
$ systectl restart squid
# 407 Proxy Authentication Required
$ curl --proxy http://minipc.home:3128 https://www.google.com
# 200 OK
$ curl --proxy http://minipc.home:3128 --proxy-negotiate https://www.google.com
ブラウザ(Firefox)を対応させる
FirefoxでのWebブラウズもProxyを通している場合は認証で弾かれるようになります。
Firefoxの設定を修正します。
- アドレスバーに
about:config
と入力し設定画面を開く -
network.negotiate-auth.trusted-uris
にproxyサーバ(minipc.home)を設定 -
network.auth.use-sspi
にfalse
を設定
use-sspiをfalseにすることでWindows統合認証ではなくMIT Kerberosの方を使用するようになります。
この設定でFirefoxのproxyの設定だけでなくFoxyProxyでも認証を通過しました。アドオンでのproxy設定も認証がちゃんと通るみたいです。
Squidをやめてlighttpdにする
Squidをいれてしばらく経って、やっぱりちょいネットが引っかかる感じなのとGemini先生がSquid通すとナゼか遅くなるのでやっぱりSquidを止めました_(:3」∠)_
でも自室内WebアプリケーションはKerberos認証を通るようににしたかったので、開発用WebサーバのlighttpdにKerberos認証を入れることにしました。
とりあえずgssapiモジュールをインストールして、
$ dnf install lighttpd-mod_authn_gssapi
modules.confを修正して読み込むようにしておきます。
server.modules += (
"mod_access",
...
"mod_authn_gssapi", <-追加
)
キータブをSquidからlighttpd用に変更します。
$ mv /etc/squid/squid.keytab /etc/lighttpd/lighttpd.keytab
$ chown lighttpd:lighttpd /etc/lighttpd/lighttpd.keytab
後はサーバ全体かサービスごとに適用するか決めて認証の設定を突っ込みます。
うちの場合はauth.backend.gssapi.store-creds
をdisable
にしないと動きませんでした。あとauth.backend.gssapi.principal
はHTTP
だけでも動きましたが一応全部書いておきました。
auth.backend = "gssapi"
auth.backend.gssapi.keytab = "/etc/lighttpd/lighttpd.keytab"
auth.backend.gssapi.principal = "HTTP/minipc.home@HOME"
auth.backend.gssapi.store-creds = "disable"
auth.require = (
"/" => (
"method" => "gssapi",
"realm" => "HOME",
"require" => "valid-user"
)
)
これだけで 認証が入るんだけどパスワード入力は不要 になるので、パスワード入力うぜー('A`)って認証ハズしちゃうこともなく。
透過的に認証が行われるっていうのは、思ってたより快適ですね☺️
ついでにApache
なんだかんだ、仕事では常にApache_(:3」∠)_
$ dnf install mod_auth_gssapi
# Require all granted
AuthType GSSAPI
AuthName "Kerberos Login"
GssapiAllowedMech krb5 # 無くても動く。入れとくとkrb5以外の認証を行わない
GssapiCredStore keytab:/etc/httpd/httpd.keytab
Require valid-user
ついでにCockpit
HTTP/minipc.home@HOMEをホスト用キータブの/etc/krb5.keytabに入れておくと、cockpitがデフォルト設定のままでもkerberos認証をしてくれます。
$ cp /etc/krb5.keytab /etc/krb5.keytab.bk
# ktaddだとKVNOが変わるので、read_kt/write_ktでコピーする
$ ktutil
ktutil: read_kt /etc/httpd/httpd.keytab
ktutil: write_kt /etc/krb5.keytab
ktutil: quit
ただしbasic認証が残ってしまうので、kerberos認証のみにする場合は[basic]を無効にしておきます。
[basic]
action = none