ProxyにKerberos認証を追加する

Webブラウザがブラウザというより環境って感じになってきた昨今、いかがお過ごしでしょうか。

何でもかんでもWebサービスでまかなえすぎて、ぼちぼちブラウザのセキュリティが一番のリスクになってきてますね😇

セキュリティやネットワークの試験でもUTMや認証付きProxyが当たり前に導入されてますし、私しかいない自室のセキュリティといえど負けてられないと自室のサーバに認証付きProxyをいれることにしました。

お前は一体何と戦っているんだ？\_(:3」∠)_

Proxyの認証には前回までで入れたKerberos認証を使います。

https://qiita.com/jp_ibis/items/dd0c77e89b9c0d126a22

認証付きProxyを導入するに当たって一番嫌だったのが認証によるWebアクセスへの一手間だったんですよねー。Kerberos導入でそこが改善できることになったので、じゃぁProxy認証を導入してみようと。

# Proxyサーバ向けプリンシパルの登録

KerberosがProxyにチケットを発行できるようKerberosのDBにProxyが動いているホストを登録します。

Proxy用のプリンシパルはHTTP/minipc.home@HOMEらしいです。

```bash
$ kadmin.local
kadmin.local:  addprinc -randkey HTTP/minipc.home@HOME
```

# Squid用にキータブを作成する

前回まではSSSDに認証を全てお任せしてたので、SSSDの実行者であるrootしかアクセスできない/etc/krb5.keytabにプリンシパルの登録をまとめてきました。

SquidはSSSDに丸投げはできないみたいでSquid自身(実行者squid)がkeytabにアクセスする必要があるため、Squid用のキータブファイルを別に用意します。

```bash
$ 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認証が行われません。順番が大切です。

```conf:/etc/squid/squid.conf
# 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を返すようになります。

```bash
$ 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を通している場合は認証で弾かれるようになります。

![スクリーンショット 2025-05-11 032641.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140718/990786e7-46d1-461d-a26e-0e7e9ef543b9.png)

Firefoxの設定を修正します。

1. アドレスバーに `about:config` と入力し設定画面を開く
1. `network.negotiate-auth.trusted-uris` にproxyサーバ(minipc.home)を設定
1. `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モジュールをインストールして、

```bash
$ dnf install lighttpd-mod_authn_gssapi
```

modules.confを修正して読み込むようにしておきます。

```conf:/etc/lighttpd/modules.conf
server.modules += (
  "mod_access",
...
  "mod_authn_gssapi",  <-追加
)
```

キータブをSquidからlighttpd用に変更します。

```bash
$ 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`だけでも動きましたが一応全部書いておきました。

```conf:vhostの設定の中とかに突っ込む
    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」∠)_

```bash
$ dnf install mod_auth_gssapi
```

```conf:vhost
#    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認証をしてくれます。

```bash
$ 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]を無効にしておきます。

```conf:/etc/cockpit/cockpit.conf
[basic]
action = none
```