Skip to content

Latest commit

 

History

History
181 lines (137 loc) · 8.05 KB

https.ja.md

File metadata and controls

181 lines (137 loc) · 8.05 KB

HTTPS 化とリバースプロキシ

English | 日本語

1.9 以降、新しくインストールした環境では、Web GUI は既定で HTTPS で動作します(自己署名の証明書、または用意した PFX ファイル)。以前の版から更新した環境は、切り替えるまで HTTP のままです。切り替えは、Windows では FileAccessMonitor.exe web-https on を実行してサービスを再起動し、Linux では sudo fileaccessmonitor-server --https on を実行します。詳しくは README の「セキュリティ」を参照してください。HTTP のままでは、ログイン時のパスワードや JWT が暗号化されずにネットワークを流れます。

HTTPS を自分で設定したい場合は、次の 2 つの方法もあります。

  • 方法 A: アプリ自身で HTTPS にする(いちばん手軽)
  • 方法 B: リバースプロキシ経由にする(IIS・nginx・Caddy などを既に使っている場合)

以下の設定は、FileAccessMonitor.exe と同じフォルダにある appsettings.Production.json に書きます。インストーラーで導入した場合は C:\Program Files\FileAccessMonitor\ です。このファイルは更新時も保持されます。編集したらサービスを再起動してください。

Restart-Service FileAccessMonitor

Note

Web GUI は絶対パス(/api/...、/login.html)を使っています。そのため、https://fam.example.com/ のようにサイトのルートで公開する必要があります。https://intranet.example.com/fam/ のようなサブパスでは動作しません。


方法 A: アプリ自身で HTTPS にする(Kestrel)

ローカル コンピューター → 個人 の証明書ストアに、秘密鍵付きの証明書が必要です。証明書の発行先は、利用者がブラウザーに入力する名前(例: fam.example.com)にしてください。サービスは LocalSystem で動くため、秘密鍵を読み取れます。

appsettings.Production.json:

{
  "Kestrel": {
    "Endpoints": {
      "Http": { "Url": "http://0.0.0.0:8080" },
      "Https": {
        "Url": "https://0.0.0.0:8443",
        "Certificate": {
          "Subject": "fam.example.com",
          "Store": "My",
          "Location": "LocalMachine",
          "AllowInvalid": false
        }
      }
    }
  }
}
  • HTTPS のみにする場合は、Http の行を削除します。そのうえで、HTTP 用のファイアウォール規則を HTTPS 用に置き換えます。

    Remove-NetFirewallRule -DisplayName "File Access Monitor Web"
    New-NetFirewallRule -DisplayName "File Access Monitor HTTPS" -Direction Inbound -Protocol TCP -LocalPort 8443 -Action Allow
  • 証明書ストアの代わりに .pfx ファイルを使う場合は、Certificate を次のように書き換えます。

    "Certificate": { "Path": "C:\\ProgramData\\FileAccessMonitor\\fam.pfx", "Password": "<pfx のパスワード>" }

    .pfx は、SYSTEM と Administrators だけが読める場所に置いてください(C:\ProgramData\FileAccessMonitor\ の機密ファイルも同じ制限にしています)。

  • 動作確認だけなら、自己署名証明書でも試せます。信頼済みにするまで、ブラウザーに警告が出ます。

    New-SelfSignedCertificate -DnsName fam.example.com -CertStoreLocation Cert:\LocalMachine\My -NotAfter (Get-Date).AddYears(2)

方法 B: リバースプロキシ

アプリと同じサーバー上にプロキシを置く場合(IIS など): アプリはループバックだけで待ち受け、プロキシ以外から直接つながらないようにします。8080 番のファイアウォール規則も削除します。

{
  "Kestrel": { "Endpoints": { "Http": { "Url": "http://127.0.0.1:8080" } } }
}
Remove-NetFirewallRule -DisplayName "File Access Monitor Web"

アプリとは別のマシンにプロキシを置く場合(Linux 上の nginx・Caddy など): 待ち受け URL は既定のままにします。8080 番へは、プロキシの IP アドレスからだけ接続できるように制限します。

Set-NetFirewallRule -DisplayName "File Access Monitor Web" -RemoteAddress 192.0.2.5   # プロキシの IP

CSP などのセキュリティヘッダーはアプリが付け、プロキシはそのまま中継します。

操作ログには、操作ごとの接続元 IP アドレスを記録します。プロキシ経由の場合、そのままではプロキシの IP が記録されます。appsettings.Production.json にプロキシを登録すると、プロキシが送る X-Forwarded-For ヘッダーから本来の接続元 IP を記録します(下記の nginx の例は送信します。IIS の ARR と Caddy は既定で送信します)。

{
  "ReverseProxy": { "KnownProxies": [ "127.0.0.1" ] }
}

同じサーバー上のプロキシなら 127.0.0.1、別のマシンならプロキシの IP アドレスを指定します。登録したアドレスからは任意の接続元 IP を名乗れるため、自分で管理しているプロキシだけを登録してください。

IIS(URL Rewrite + Application Request Routing)

  1. URL Rewrite と Application Request Routing (ARR) をインストールします。

  2. ARR のプロキシ機能を有効にします。

    Set-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' -Filter 'system.webServer/proxy' -Name 'enabled' -Value 'True'
  3. サイトを作成します(例: サイト名 FileAccessMonitor、物理パス C:\inetpub\fam の空フォルダー)。証明書を指定して HTTPS バインドを追加します。

  4. そのフォルダーに次の web.config を置きます。

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
      <system.webServer>
        <rewrite>
          <rules>
            <!-- HTTP を HTTPS へリダイレクト(サイトに HTTP バインドもある場合のみ必要) -->
            <rule name="Redirect to HTTPS" stopProcessing="true">
              <match url="(.*)" />
              <conditions>
                <add input="{HTTPS}" pattern="off" />
              </conditions>
              <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
            </rule>
            <rule name="FileAccessMonitor" stopProcessing="true">
              <match url="(.*)" />
              <action type="Rewrite" url="http://127.0.0.1:8080/{R:1}" />
            </rule>
          </rules>
        </rewrite>
        <httpProtocol>
          <customHeaders>
            <add name="Strict-Transport-Security" value="max-age=31536000" />
          </customHeaders>
        </httpProtocol>
      </system.webServer>
    </configuration>

nginx

server {
    listen 80;
    server_name fam.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    http2 on;
    server_name fam.example.com;

    ssl_certificate     /etc/ssl/certs/fam.example.com.crt;
    ssl_certificate_key /etc/ssl/private/fam.example.com.key;

    add_header Strict-Transport-Security "max-age=31536000" always;

    location / {
        proxy_pass http://192.0.2.10:8080;   # FileAccessMonitor のサーバー
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Caddy

Caddy は証明書を自動で取得・更新します。社内 LAN の中でしか名前解決できないホスト名の場合は、tls internal を追加すると Caddy 自身の CA で証明書を発行します。

fam.example.com {
    reverse_proxy 192.0.2.10:8080
    header Strict-Transport-Security "max-age=31536000"
}