Web サーバーとリバースプロキシーのデプロイ
Web サーバーとリバースプロキシーのセットアップと設定
概要
Red Hat ドキュメントへのフィードバック (英語のみ) リンクのコピーリンクがクリップボードにコピーされました!
Red Hat は質の高いドキュメントを提供することに尽力しており、皆様からのフィードバックを大切にしています。改善にご協力いただくため、Red Hat Jira トラッキングシステムを通じてご提案やエラー報告をお寄せください。
手順
Jira の Web サイトにログインします。
アカウントがない場合、アカウント作成オプションを選択します。
- 上部のナビゲーションバーで Create をクリックします。
- Summary フィールドにわかりやすいタイトルを入力します。
- Description フィールドに、ドキュメントの改善に関するご意見を記入してください。ドキュメントの該当部分へのリンクも追加してください。
- ダイアログの下部にある Create をクリックします。
第1章 Apache HTTP Web サーバーの設定 リンクのコピーリンクがクリップボードにコピーされました!
Web サイトや Web アプリケーションをホストするために、Apache HTTP サーバーをデプロイします。仮想ホストの設定、サービスの管理、静的または動的コンテンツの効率的なクライアントへの配信を行います。
1.1. Apache HTTP Web サーバーの概要 リンクのコピーリンクがクリップボードにコピーされました!
Web サイトや Web アプリケーションをホストするには、Apache HTTP Web サーバーを使用できます。Web サーバー とは、Web ページやその他の文書などのコンテンツをインターネット経由でクライアントに配信するネットワークサービスです。
Web サーバーは HTTP プロトコルを使用するため、HTTP サーバーとも呼ばれます。Apache HTTP Server (httpd とも呼ばれる) は、Apache Software Foundation によって開発されたオープンソースの Web サーバーです。Red Hat Enterprise Linux の以前のリリースからアップグレードする場合は、httpd サービス設定を更新する必要があります。
1.2. Apache 設定ファイル リンクのコピーリンクがクリップボードにコピーされました!
Apache HTTP Web サーバーを設定することで、サーバーパラメーターや仮想ホストを設定できます。httpd サービスは、デフォルトでは起動後に設定ファイルを読み込みます。
| パス | 説明 |
|---|---|
|
| 主要設定ファイル。 |
|
| メイン設定ディレクトリーには、設定ファイル用の補助ディレクトリーが用意されています。 |
|
| Red Hat Enterprise Linux に同梱されているインストール済みの動的モジュールをロードするための設定ファイルを格納する補助ディレクトリー。デフォルト設定では、これらの設定ファイルの処理が優先されます。 |
メインの設定ファイルはほとんどの状況に適していますが、他の設定オプションを使用することもできます。
変更を有効にするには、まず Web サーバーを再起動します。変更内容を元に戻せるよう、設定ファイルを編集する前にバックアップを作成します。
設定にエラーがないか確認するには、以下を入力します。
# apachectl configtest
Syntax OK
詳細は、お使いのシステムの apachectl(8) の man ページを参照してください。
1.3. httpd サービスの管理 リンクのコピーリンクがクリップボードにコピーされました!
Apache HTTP Web サーバーを管理するには、httpd サービスを開始、停止、再起動できます。
前提条件
- Apache HTTP サーバーがインストールされている。
手順
httpdサービスを起動するには、以下を入力します。# systemctl start httpdhttpdサービスを停止するには、以下を入力します。# systemctl stop httpdhttpdサービスを再起動するには、以下を入力します。# systemctl restart httpd
1.4. 単一インスタンスの Apache HTTP サーバーの設定 リンクのコピーリンクがクリップボードにコピーされました!
Web サーバーを通じて静的コンテンツを配信するには、Apache HTTP サーバーを設定してこれらのコンテンツを配信するようにします。
デフォルトでは、Apache HTTP サーバーは、サーバーに関連付けられているすべてのドメインに対して同じコンテンツを提供します。異なるドメインに異なるコンテンツを提供する場合は、名前ベースの仮想ホストを設定します。詳細は、Apache の名前ベース仮想ホストの設定 を参照してください。
前提条件
- Transport Layer Security (TLS) プロトコルを設定する前に、基本的な Web サービス接続を有効にするためのファイアウォールルールを設定した。
手順
httpdパッケージをインストールします。# dnf install httpdfirewalldを使用する場合は、ローカルのファイアウォールで TCP ポート80を開きます。# firewall-cmd --permanent --add-port=80/tcp# firewall-cmd --reloadhttpdサービスを有効にして起動します。# systemctl enable --now httpdオプション: HTML ファイルを
/var/www/html/ディレクトリーに追加します。注記/var/www/html/にコンテンツを追加する際は、ファイルやディレクトリーが、デフォルトでhttpdが実行されるユーザーによって読み取り可能である必要があります。コンテンツの所有者は、rootユーザーおよびrootユーザーグループ、または管理者が選択した別のユーザーまたはグループのどちらかです。コンテンツの所有者がrootユーザーおよびrootユーザーグループの場合には、他のユーザーがファイルを読み取れるようにする必要があります。すべてのファイルとディレクトリーには、httpd_sys_content_tSELinux コンテキストが必要です。これは、デフォルトでは/var/wwwディレクトリー内のすべてのコンテンツに適用されます。Web ブラウザーで
http://server_IP_or_host_name/に接続します。/var/www/html/ディレクトリーが空であるか、index.htmlまたはindex.htmファイルが含まれていない場合は、Apache がRed Hat Enterprise Linux Test Pageを表示します。/var/www/html/に異なる名前の HTML ファイルが含まれる場合は、http://server_IP_or_host_name/example.htmlなど、そのファイル名に URL を指定してロードできます。詳細は、お使いのシステムの
httpd.service(8)の man ページを参照してください。
1.5. Apache 名前ベースの仮想ホストの設定 リンクのコピーリンクがクリップボードにコピーされました!
異なるドメインの複数の Web サイトを単一の Apache HTTP サーバーでホストするには、名前ベースの仮想ホストを設定できます。名前ベースの仮想ホストを使用すると、Apache HTTP サーバーは、サーバーの IP アドレスに解決される異なるドメインに、異なる Web サイトを分散させることができます。
example.com ドメインと example.net ドメインの両方に対して、それぞれ別のドキュメントルートディレクトリーを持つ仮想ホストを設定できます。どちらの仮想ホストも静的 HTML コンテンツを提供します。
前提条件
クライアントおよび Web サーバーは、
example.comおよびexample.netドメインを Web サーバーの IP アドレスに解決している。example.comとexample.netのドメインエントリーは、DNS サーバーに手動で追加する必要があることに注意してください。
手順
httpdパッケージをインストールします。# dnf install httpd/etc/httpd/conf/httpd.confファイルを編集します。example.comドメイン向けに以下の仮想ホスト設定を追加します。<VirtualHost *:80> DocumentRoot "/var/www/example.com/" ServerName example.com CustomLog /var/log/httpd/example.com_access.log combined ErrorLog /var/log/httpd/example.com_error.log </VirtualHost>これらの設定は以下を設定します。
-
<VirtualHost *:80>ディレクティブのすべての設定は、この仮想ホストに固有のものです。 -
DocumentRootは、仮想ホストの Web コンテンツへのパスを設定します。 ServerNameは、この仮想ホストがコンテンツを提供するドメインを設定します。複数のドメインを設定するには、
ServerAliasパラメーターを設定に追加し、追加のドメインをスペース区切りで、このパラメーターに指定します。-
CustomLogは、仮想ホストのアクセスログへのパスを設定します。 ErrorLogは、仮想ホストのエラーログへのパスを設定します。注記Apache HTTP サーバーは、
ServerNameおよびServerAliasパラメーターで設定されたドメインに一致しないリクエストに対しても、設定ファイル内で最初に見つかった仮想ホストを使用します。これには、サーバーの IP アドレス対してに送信される要求も含まれます。
-
example.netドメイン向けに同様の仮想ホスト設定を追加します。<VirtualHost *:80> DocumentRoot "/var/www/example.net/" ServerName example.net CustomLog /var/log/httpd/example.net_access.log combined ErrorLog /var/log/httpd/example.net_error.log </VirtualHost>両方の仮想ホストのドキュメントルートを作成します。
# mkdir /var/www/example.com/ # mkdir /var/www/example.net/restoreconコマンドを実行するには、policycoreutils-python-utilsパッケージをインストールします。# dnf install policycoreutils-python-utilsDocumentRootパラメーターのパスが/var/www/内にない設定を行う場合は、両方のドキュメントルートにhttpd_sys_content_tコンテキストを設定します。# semanage fcontext -a -t httpd_sys_content_t "/srv/example.com(/.*)?" # restorecon -Rv /srv/example.com/ # semanage fcontext -a -t httpd_sys_content_t "/srv/example.net(/.\*)?" # restorecon -Rv /srv/example.net/以下のコマンドは、
/srv/example.com/および/srv/example.net/ディレクトリーにhttpd_sys_content_tコンテキストを設定します。firewalldを使用する場合は、ローカルのファイアウォールでポート80を開きます。# firewall-cmd --permanent --add-port=80/tcp # firewall-cmd --reloadhttpdサービスを有効にして起動します。# systemctl enable --now httpd
検証
仮想ホストのドキュメントルートごとに異なるサンプルファイルを作成します。
# echo "vHost example.com" > /var/www/example.com/index.html # echo "vHost example.net" > /var/www/example.net/index.html-
ブラウザーを使用して
http://example.comに接続します。Web サーバーは、example.com仮想ホストからのサンプルファイルを表示します。
詳細は、お使いのシステムの httpd(8) および httpd.conf(5) の man ページを参照してください。
1.6. TLS クライアント証明書認証の設定 リンクのコピーリンクがクリップボードにコピーされました!
認証されたユーザーのみが Web サーバー上のリソースにアクセスできるようにするには、/var/www/html/Example/ ディレクトリーに対してクライアント証明書認証を設定します。
Apache HTTP サーバーが Transport Layer Security (TLS)1.3 プロトコルを使用する場合、一部のクライアントでは追加の設定が必要になります。たとえば、Mozilla Firefox では、about:config メニューで security.tls.enable_post_handshake_auth パラメーターを true に設定します。
前提条件
- サーバーで TLS 暗号化を有効にした。
手順
クライアント認証を設定するには、
/etc/httpd/conf/httpd.confファイルを編集します。<Directory "/var/www/html/Example/"> SSLVerifyClient require </Directory>SSLVerifyClient require設定は、クライアントが/var/www/html/Example/ディレクトリー内のコンテンツにアクセスする前に、クライアント証明書を要求するようにサーバーを設定します。httpdサービスを再起動します。# systemctl restart httpd
検証
クライアント認証なしで
https://example.com/Example/URL にアクセスします。$ curl \https://example.com/Example/curl: (56) OpenSSL SSL_read: error:1409445C:SSL routines:ssl3_read_bytes:tlsv13 alert certificate required, errno 0このエラーは、Web サーバーにクライアント証明書認証が必要であることを示しています。
クライアントの秘密鍵と証明書、および CA 証明書を渡すことで、クライアント認証を使用して同じ URL にアクセスします。
$ curl --cacert ca.crt --key client.key --cert client.crt https://example.com/Example/リクエストが成功すると、
curlユーティリティーは/var/www/html/Example/ディレクトリーに保存されているindex.htmlファイルを表示します。
1.7. Apache HTTP サーバーのインストール手順 リンクのコピーリンクがクリップボードにコピーされました!
各種設定作業を行うには、Apache HTTP Server のマニュアルを参照してください。このマニュアルには、設定パラメーターとディレクティブ、パフォーマンスチューニング、認証設定、モジュール、コンテンツキャッシュ、セキュリティーに関するヒント、および TLS 暗号化の設定に関する詳細なドキュメントが含まれています。
前提条件
- Apache HTTP Server がインストールされ、実行している。
手順
httpd-manualパッケージをインストールします。# dnf install httpd-manualオプション: デフォルトでは、Apache HTTP Server に接続するすべてのクライアントはマニュアルを表示できます。
192.0.2.0/24サブネットなど、特定の IP 範囲へのアクセスを制限するには、/etc/httpd/conf.d/manual.confファイルを編集し、Require ip 192.0.2.0/24設定を<Directory "/usr/share/httpd/manual">ディレクティブに追加します。<Directory "/usr/share/httpd/manual"> ... Require ip 192.0.2.0/24 ... </Directory>httpdサービスを再起動します。# systemctl restart httpd
検証
-
Apache HTTP Server のマニュアルを表示するには、Web ブラウザーを使用して
http://host_name_or_IP_address/manual/URL に接続します。
第2章 Apache HTTP Web サーバーの Kerberos 認証の設定 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat Enterprise Linux (RHEL) で Apache の mod_auth_gssapi モジュールを使用するには、Apache HTTP Web サーバーの Kerberos 認証を設定します。Generic Security Services API (GSSAPI) は、Kerberos セキュリティーライブラリーを使用する要求を行うアプリケーションのインターフェイスです。
2.1. IdM 環境で gss-proxy を設定する リンクのコピーリンクがクリップボードにコピーされました!
さまざまなサービスやアプリケーション間で、Kerberos で保護されたリソースへの安全かつ認証されたアクセスを可能にするには、Apache HTTP Web サーバー上に汎用セキュリティーサービスプロキシー (GSS プロキシー) を設定できます。gssproxy サービスを実装することで、httpd サーバーの特権分離を有効にできます。gssproxy は、このプロセスにセキュリティー最適化機能を提供します。mod_auth_gssapi モジュールは、現在のバージョンの Red Hat Enterprise Linux (RHEL) では利用できなくなった mod_auth_kerb モジュールに取って代わるものであることに注意してください。
前提条件
-
httpd、mod_auth_gssapi、およびgssproxyパッケージがインストールされている。 -
httpdサービスの設定と起動が済んでいる。
手順
サービスプリンシパルを作成し、
HTTP/<SERVER_NAME>@realmプリンシパルのkeytabファイルへのアクセスを有効にします。# ipa service-add HTTP/<SERVER_NAME>/etc/gssproxy/http.keytabファイルに保存されているプリンシパルのkeytabを取得します。# ipa-getkeytab -s $(awk '/^server =/ {print $3}' /etc/ipa/default.conf) -k /etc/gssproxy/http.keytab -p HTTP/$(hostname -f)この手順ではパーミッションを 400 に設定するため、
rootユーザーのみがkeytabファイルにアクセスできます。apacheユーザーはアクセスできません。以下の内容で
/etc/gssproxy/80-httpd.confファイルを作成します。[service/HTTP] mechs = krb5 cred_store = keytab:/etc/gssproxy/http.keytab cred_store = ccache:/var/lib/gssproxy/clients/krb5cc_%U euid = apachegssproxyサービスを再起動して、有効にします。# systemctl restart gssproxy.service # systemctl enable gssproxy.service
検証
Kerberos チケットを取得します。
# kinit- ブラウザーで、保護されているディレクトリーの URL を開きます。
詳細は、お使いのシステムの gssproxy(8)、gssproxy-mech(8)、gssproxy.conf(5) の man ページを参照してください。
第3章 Apache HTTP サーバーで TLS 暗号化を設定する リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、Apache はセキュリティー保護されていない HTTP 接続を使用してクライアントにコンテンツを配信します。Web トラフィックを保護するには、Apache HTTP サーバーで TLS 暗号化を有効にし、よく使用される暗号化関連の設定を行うことができます。
3.1. Apache HTTP サーバーに TLS 暗号化を追加する リンクのコピーリンクがクリップボードにコピーされました!
mod_ssl をインストールすることで、Web トラフィックを保護できます。仮想ホストが IdM 発行の秘密鍵と証明書を使用するように設定し、サブ CA 認証情報を使用してドメインの暗号化された HTTPS 接続を有効にします。
前提条件
- Apache HTTP Server がインストールされ、実行している。
秘密鍵が
/etc/pki/tls/private/example.com.keyファイルに保存されている。秘密鍵と証明書署名要求 (CSR) の作成方法、および認証局 (CA) から証明書を要求する方法の詳細は、使用している認証局のドキュメントを参照してください。
-
TLS 証明書が
/etc/pki/tls/certs/example.com.crtファイルに保存されている。別のパスを使用する場合は、該当する手順に従います。 -
認証局証明書が
/etc/pki/tls/certs/ca.crtファイルに保存されている。別のパスを使用する場合は、該当する手順に従います。 - クライアントおよび Web サーバーは、サーバーのホスト名を Web サーバーの IP アドレスに対して解決している。
-
サーバーが Red Hat Enterprise Linux 10 (RHEL) を実行し、Federal Information Processing Standards (FIPS) モードが有効になっている場合、クライアントは
xtended Master Secret(EMS) 拡張機能をサポートするか、Transport Layer Security (TLS) 1.3 を使用する必要があります。EMS を使用しない TLS 1.2 接続は失敗します。詳細は、Red Hat Knowledgebase ソリューション TLS extension "Extended Master Secret" enforced を参照してください。
手順
mod_sslパッケージをインストールします。# dnf install mod_ssl/etc/httpd/conf.d/ssl.confファイルを編集し、以下の設定を<VirtualHost _default_:443>ディレクティブに追加します。サーバー名を設定します。
ServerName example.comサーバー名は、証明書の
Common Nameフィールドに設定されているエントリーと一致する必要があります。オプション: 証明書の
Subject Alt Names(SAN) フィールドに追加のホスト名が含まれる場合に、これらのホスト名にも TLS 暗号化を提供するようにmod_sslを設定できます。これを設定するには、ServerAliasesパラメーターと対応する名前を追加します。ServerAlias www.example.com server.example.com秘密鍵、サーバー証明書、および CA 証明書へのパスを設定します。
SSLCertificateKeyFile "/etc/pki/tls/private/example.com.key" SSLCertificateFile "/etc/pki/tls/certs/example.com.crt" SSLCACertificateFile "/etc/pki/tls/certs/ca.crt"
セキュリティー上の理由から、
rootユーザーのみが秘密鍵ファイルにアクセスできるように設定します。# chown root:root /etc/pki/tls/private/example.com.key# chmod 600 /etc/pki/tls/private/example.com.key警告秘密鍵に権限のないユーザーがアクセスした場合は、証明書を取り消し、新しい秘密鍵を作成し、新しい証明書を要求します。そうでない場合は、TLS 接続が安全ではなくなります。
-
Web ブラウザーを開いて、
https://example.comに接続します。
-
Web ブラウザーを開いて、
3.2. Apache HTTP サーバーでサポートされる TLS プロトコルバージョンの設定 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、RHEL の Apache HTTP Server は、最新のブラウザーにも互換性のある安全なデフォルト値を定義するシステム全体の暗号化ポリシーを使用します。たとえば、DEFAULT ポリシーでは、TLSv1.2 および TLSv1.3 プロトコルバージョンのみが Apache HTTP サーバーで有効になるように定義します。
Apache HTTP サーバーがサポートする TLS プロトコルバージョンは、手動で設定できます。次のような場合は、環境内で特定の TLS プロトコルバージョンのみを有効にする必要があります。
-
お使いの環境のクライアントで、セキュリティーの低い
TLS1(TLSv1.0) プロトコルまたはTLS1.1プロトコルも使用できるようにする必要がある場合。 -
Apache が
TLSv1.2プロトコルまたはTLSv1.3プロトコルのみに対応するように設定する場合。
前提条件
- サーバー上で transport layer security (TLS) 暗号化を有効化した。
-
サーバーが Red Hat Enterprise Linux 10 (RHEL) を実行し、Federal Information Processing Standards (FIPS) モードが有効になっている場合、クライアントによる
xtended Master Secret(EMS) 拡張機能のサポートがあるか、クライアントで Transport Layer Security (TLS) 1.3 を使用する。EMS を使用しない TLS 1.2 接続は失敗します。詳細は、Red Hat Knowledgebase ソリューション TLS extension "Extended Master Secret" enforced を参照してください。
手順
/etc/httpd/conf/httpd.confファイルを編集し、TLSv1.3プロトコルバージョンを設定する<VirtualHost>ディレクティブを追加します。SSLProtocol -All TLSv1.3httpdサービスを再起動します。# systemctl restart httpd
検証
TLSv1.3のサポートを確認します。# openssl s_client -connect example.com:443 -tls1_3TLSv1.2のサポートを確認します。# openssl s_client -connect example.com:443 -tls1_2サーバーがプロトコルに対応していない場合には、このコマンドは以下のエラーを返します。
140111600609088:error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version:ssl/record/rec_layer_s3.c:1543:SSL alert number 70- オプション: 他の TLS プロトコルバージョンのコマンドを繰り返し実行します。
3.3. Apache HTTP サーバーでサポートされる暗号スイートを設定する リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、Apache HTTP Server は、最新のブラウザーにも互換性のある安全なデフォルト値を定義するシステム全体の暗号化ポリシーを使用します。システム全体の暗号化ポリシーで許可されている暗号方式のリストは、/etc/crypto-policies/back-ends/openssl.config ファイルを参照してください。
Apache HTTP サーバーがサポートする暗号方式は、手動で設定できます。
前提条件
- サーバーで Transport Layer Security (TLS) 暗号化を有効にした。
手順
nmapパッケージをインストールします。# dnf install nmap/etc/httpd/conf/httpd.confファイルを編集し、TLS 暗号を設定する<VirtualHost>ディレクティブにSSLCipherSuiteパラメーターを追加します。SSLCipherSuite "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:!SHA1:!SHA256"この例では、
EECDH+AESGCM、EDH+AESGCM、AES256+EECDH、およびAES256+EDH暗号のみを有効にし、SHA1およびSHA256メッセージ認証コード (MAC) を使用するすべての暗号を無効にします。httpdサービスを再起動します。# systemctl restart httpd
検証
サポートされている暗号方式を表示します。
# nmap --script ssl-enum-ciphers -p 443 example.com... PORT STATE SERVICE 443/tcp open https | ssl-enum-ciphers: | TLSv1.2: | ciphers: | TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (ecdh_x25519) - A | TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 (dh 2048) - A | TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (ecdh_x25519) - A ...
第4章 Apache モジュールの操作 リンクのコピーリンクがクリップボードにコピーされました!
httpd サービスはモジュール式のアプリケーションであり、複数の Dynamic Shared Object (DSO) で拡張できます。必要に応じて、実行時に DSO モジュールを動的にロードまたはアンロードできます。これらのモジュールは /usr/lib64/httpd/modules/ ディレクトリーにあります。
4.1. Dynamic Shared Object モジュールの読み込み リンクのコピーリンクがクリップボードにコピーされました!
Apache HTTP サーバーの機能を設定するには、Dynamic Shared Object (DSO) モジュールをロードできます。特定の DSO モジュールをロードするには、LoadModule ディレクティブを使用する必要があります。別のパッケージには、/etc/httpd/conf.modules.d/ ディレクトリーに独自の設定ファイルが格納されているモジュールが含まれています。
前提条件
-
httpdパッケージをインストールしている。
手順
/etc/httpd/conf.modules.d/ディレクトリーの設定ファイルでモジュール名を検索します。# grep mod_ssl.so /etc/httpd/conf.modules.d/*モジュール名が記載されている設定ファイル内の、該当モジュールの
LoadModuleディレクティブのコメントを解除してください。LoadModule ssl_module modules/mod_ssl.soモジュールが見つからなかった場合 (たとえば、Red Hat Enterprise Linux (RHEL) パッケージにモジュールが含まれていない場合)、
/etc/httpd/conf.modules.d/30-example.confのような設定ファイルを作成し、次のディレクティブを追加します。LoadModule ssl_module modules/<custom_module>.sohttpdサービスを再起動します。# systemctl restart httpd
検証
モジュールがロードされ、有効になっていることを確認します。
# httpd -M | grep ssl
4.2. カスタム Apache モジュールのコンパイル リンクのコピーリンクがクリップボードにコピーされました!
独自のモジュールを作成し、モジュールのコンパイルに必要なインクルードファイル、ヘッダーファイル、および Apache Extension (apxs) ユーティリティーを含む httpd-devel パッケージを使用してビルドできます。
前提条件
-
httpd-develパッケージがインストールされている。
手順
カスタムモジュールをビルドします。
# apxs -i -a -c module_name.c
検証
- DSO モジュールのロード で説明されている方法でモジュールをロードします。
第5章 NGINX の設定および設定 リンクのコピーリンクがクリップボードにコピーされました!
NGINX は、Web サーバー、リバースプロキシー、HTTP ロードバランサーとして使用できる、高性能でモジュール式のサーバーです。
5.1. NGINX のインストールおよび準備 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat は、Application Streams を使用して NGINX の異なるバージョンを提供します。Application Streams を使用すると、ストリームを選択して NGINX をインストールし、ファイアウォールで必要なポートを開き、nginx サービスを有効化して起動できます。
デフォルトでは、NGINX はポート 80 で Web サーバーとして動作し、/usr/share/nginx/html/ ディレクトリーからコンテンツを提供します。
前提条件
- Red Hat のサブスクリプション がある。
-
firewalldサービスは有効で、実行中である。
手順
nginxパッケージをインストールします。# dnf install nginxファイアウォールで、NGINX がサービスを実行するために必要なポートを開放します。たとえば、
firewalldで HTTP (ポート 80) および HTTPS (ポート 443) のデフォルトポートを開くには、次のコマンドを実行します。# firewall-cmd --permanent --add-port={80/tcp,443/tcp} # firewall-cmd --reloadシステムの起動時に
nginxサービスが自動的に起動するようにします。# systemctl enable nginxオプション:
nginxサービスを起動します。# systemctl start nginxデフォルト設定を使用しない場合は、この手順を省略し、サービスを起動する前に NGINX を設定します。
検証
nginxパッケージがインストールされていることを確認します。# dnf list installed nginxInstalled Packages nginx.x86_64 1:1.14.1-9.module+el8.0.0+4108+af250afe @rhel-8-for-x86_64-appstream-rpmsNGINX がサービスを実行する際にファイアウォールで許可されているポートを確認します。
# firewall-cmd --list-ports80/tcp 443/tcpnginxサービスが有効になっていることを確認します。# systemctl is-enabled nginxenabled
5.2. NGINX を Web サーバーとして設定し、異なるドメインに異なるコンテンツを配信する リンクのコピーリンクがクリップボードにコピーされました!
リソースの使用と管理を最適化するために、NGINX Web サーバーを設定して、ドメインごとに異なるコンテンツを配信できます。デフォルトでは、NGINX はサーバーの IP アドレスに関連付けられているすべてのドメイン名に対して、同じコンテンツをクライアントに配信します。
NGINX を設定することで、ドメインへのリクエストを上記の方法で処理できます。example.com ドメインには /var/www/example.com/ ディレクトリーのコンテンツを、example.net ドメインには /var/www/example.net/ ディレクトリーのコンテンツを、その他のすべてのリクエストには /usr/share/nginx/html/ ディレクトリーのコンテンツをそれぞれ提供します。
前提条件
- NGINX がインストールされている。
クライアントおよび Web サーバーは、
example.comおよびexample.netドメインを Web サーバーの IP アドレスに解決している。これらのエントリーは DNS サーバーに手動で追加する必要がある点に注意してください。
手順
/etc/nginx/nginx.confファイルを編集します。デフォルトでは、
/etc/nginx/nginx.confファイルには、すでにすべてにもれなく対応する設定が含まれます。設定からこの部分を削除した場合は、以下のserverブロックを/etc/nginx/nginx.confファイルのhttpブロックに追加し直します。server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /usr/share/nginx/html; }-
listenディレクティブは、サービスがリッスンする IP アドレスとポートを定義します。この場合、NGINX は IPv4 と IPv6 の両方のアドレスのポート80でリッスンします。default_serverパラメーターは、NGINX がこのserverブロックを IP アドレスとポートに一致するリクエストのデフォルトとして使用していることを示します。 -
server_nameパラメーターは、このserverブロックに対応するホスト名を定義します。server_nameを_に設定すると、NGINX はこのserverブロックに対して任意のホスト名を受け入れるように設定されます。 -
rootディレクティブは、このserverブロックの Web コンテンツへのパスを設定します。
-
example.comドメインの同様のserverブロックをhttpブロックに追加します。server { server_name example.com; root /var/www/example.com/; access_log /var/log/nginx/example.com/access.log; error_log /var/log/nginx/example.com/error.log; }-
access_logディレクティブは、このドメインに別のアクセスログファイルを定義します。 -
error_logディレクティブは、このドメインに別のエラーログファイルを定義します。
-
example.netドメインの同様のserverブロックをhttpブロックに追加します。server { server_name example.net; root /var/www/example.net/; access_log /var/log/nginx/example.net/access.log; error_log /var/log/nginx/example.net/error.log; }
両ドメインのメインディレクトリーを作成します。
# mkdir -p /var/www/example.com/ # mkdir -p /var/www/example.net/両方のメインディレクトリーに
httpd_sys_content_tコンテキストを設定します。# semanage fcontext -a -t httpd_sys_content_t "/var/www/example.com(/.*)?" # restorecon -Rv /var/www/example.com/ # semanage fcontext -a -t httpd_sys_content_t "/var/www/example.net(/.\*)?" # restorecon -Rv /var/www/example.net/これらのコマンドは、
/var/www/example.com/ディレクトリーおよび/var/www/example.net/ディレクトリーにhttpd_sys_content_tコンテキストを設定します。policycoreutils-python-utilsパッケージをインストールしてrestoreconコマンドを実行する必要がある点に注意してください。両方のドメインのログディレクトリーを作成します。
# mkdir /var/log/nginx/example.com/ # mkdir /var/log/nginx/example.net/nginxサービスを再起動します。# systemctl restart nginx
検証
仮想ホストのドキュメントルートごとに異なるサンプルファイルを作成します。
# echo "Content for example.com" > /var/www/example.com/index.html # echo "Content for example.net" > /var/www/example.net/index.html # echo "Catch All content" > /usr/share/nginx/html/index.html-
ブラウザーを使用して
http://example.comに接続します。Web サーバーは、/var/www/example.com/index.htmlファイルからのサンプルコンテンツを表示します。 -
ブラウザーを使用して
http://example.netに接続します。Web サーバーは、/var/www/example.net/index.htmlファイルからのサンプルコンテンツを表示します。 -
ブラウザーを使用して
http://IP_address_of_the_serverに接続します。Web サーバーは、/usr/share/nginx/html/index.htmlファイルからのサンプルコンテンツを表示します。
5.3. NGINX Web サーバーへの TLS 暗号化の追加 リンクのコピーリンクがクリップボードにコピーされました!
盗聴や中間者攻撃から保護するために、NGINX Web サーバーで Transport Layer Security (TLS) プロトコル暗号化を有効にできます。
前提条件
- NGINX がインストールされている。詳細は、NGINX のインストールと準備 を参照してください。
秘密鍵が
/etc/pki/tls/private/example.com.keyファイルに保存されている。秘密鍵と証明書署名要求 (CSR) の作成方法、および認証局 (CA) から証明書を要求する方法の詳細は、使用している認証局のドキュメントを参照してください。
-
TLS 証明書が
/etc/pki/tls/certs/example.com.crtファイルに保存されている。別のパスを使用する場合は、この手順で対応する手順を調整します。 - CA 証明書がサーバーの TLS 証明書ファイルに追加されている。
- クライアントと Web サーバーは、サーバーのホスト名を Web サーバーの IP アドレスに解決します。
-
ポート
443が、ローカルのファイアウォールで開放されている。 -
サーバーが Red Hat Enterprise Linux 10 を実行し、Federal Information Processing Standards (FIPS) モードが有効になっている場合、クライアントによる
xtended Master Secret(EMS) 拡張機能のサポートがあるか、クライアントで Transport Layer Security (TLS) 1.3 を使用する。EMS を使用しない TLS 1.2 接続は失敗します。詳細は、TLS extension "Extended Master Secret" enforced - Red Hat Knowledgebase solution を参照してください。
手順
/etc/nginx/nginx.confファイルを編集し、設定のhttpブロックに以下のserverブロックを追加します。server { listen 443 ssl; server_name example.com; root /usr/share/nginx/html; ssl_certificate /etc/pki/tls/certs/example.com.crt; ssl_certificate_key /etc/pki/tls/private/example.com.key; }オプション:RHEL 9.3 以降では、
ssl_pass_phrase_dialogディレクティブを使用して、暗号化された秘密鍵ごとに NGINX が起動時に呼び出す外部プログラムを設定できます。次の行のいずれかを/etc/nginx/nginx.confファイルに追加します。暗号化された秘密キーファイルごとに外部プログラムを呼び出すには、次のように入力します。
ssl_pass_phrase_dialog exec:<path_to_program>;NGINX は、次の 2 つの引数を使用してこのプログラムを呼び出します。
-
server_name設定で指定されたサーバー名。 -
以下のアルゴリズムのいずれか:
RSA、DSA、EC、DH、または NGINX が暗号アルゴリズムを認識できない場合はUNK。
-
暗号化された秘密キーファイルごとにパスフレーズを手動で入力する場合は、次のように入力します。
ssl_pass_phrase_dialog builtin;これは、
ssl_pass_phrase_dialogが設定されていない場合のデフォルトの動作です。この方法を使用しても、少なくとも 1 つの秘密キーがパスフレーズで保護されている場合、
nginxサービスは起動に失敗することに注意してください。この場合は、他のいずれかの方法を使用してください。systemctlユーティリティーを使用してnginxサービスを開始するときに、systemdで暗号化された秘密キーごとにパスフレーズの入力を求めるプロンプトを表示するには、次のように入力します。ssl_pass_phrase_dialog exec:/usr/libexec/nginx-ssl-pass-dialog;
セキュリティー上の理由から、
rootユーザーのみが秘密鍵ファイルにアクセスできるように設定します。# chown root:root /etc/pki/tls/private/example.com.key # chmod 600 /etc/pki/tls/private/example.com.key警告秘密鍵に権限のないユーザーがアクセスできる場合は、証明書を取り消し、新しい秘密鍵を作成し、新しい証明書を要求します。そうでない場合は、TLS 接続が安全ではなくなります。
nginxサービスを再起動します。# systemctl restart nginx
検証
-
ブラウザーを使用して、
https://example.comに接続します。
5.4. HTTP トラフィックのリバースプロキシーとしての NGINX の設定 リンクのコピーリンクがクリップボードにコピーされました!
リモートサーバー上の特定のサブディレクトリーにリクエストを転送するには、NGINX Web サーバーを HTTP トラフィックのリバースプロキシーとして動作するように設定できます。
クライアント側からは、クライアントはアクセス先のホストからコンテンツを読み込みます。ただし、NGINX は実際のコンテンツをリモートサーバーから読み込み、クライアントに転送します。NGINX を設定することで、Web サーバー上の /example ディレクトリーからのトラフィックを URL https://example.com に転送できます。
前提条件
- NGINX がインストールされている。
- 必要に応じて、TLS 暗号化がリバースプロキシーで有効になっている。
手順
/etc/nginx/nginx.confファイルを編集し、リバースプロキシーを提供するserverブロックに以下の設定を追加します。location /example { proxy_pass https://example.com; }locationブロックでは、NGINX が/exampleディレクトリー内のすべての要求をhttps://example.comに渡すことを定義します。SELinux ブール値パラメーター
httpd_can_network_connectを1に設定して、NGINX によるトラフィックの転送を SELinux が許可するように設定します。# setsebool -P httpd_can_network_connect 1nginxサービスを再起動します。# systemctl restart nginx
検証
-
ブラウザーを使用して
http://host_name/exampleに接続すると、https://example.comの内容が表示されます。
5.5. NGINX の HTTP ロードバランサーとしての設定 リンクのコピーリンクがクリップボードにコピーされました!
異なるサーバーへのリクエスト数を設定したり、フォールバックホストを設定したりするには、NGINX のリバースプロキシー機能を使用してロードバランシングを行うことができます。
NGINX を HTTP ロードバランサーとして設定すると、トラフィックが複数のサーバーに振り分けられます。ロードバランサーは、アクティブな接続数が最も少ないサーバーを選択します。プライマリーサーバーが利用できない場合、NGINX は自動的にリクエストをフォールバックホストに送信します。
前提条件
- NGINX がインストールされている。
手順
/etc/nginx/nginx.confファイルの設定を編集します。http { upstream backend { least_conn; server server1.example.com; server server2.example.com; server server3.example.com backup; } server { location / { proxy_pass http://backend; } } }backendという名前のホストグループのleast_connディレクティブは、アクティブな接続数が最も少ないホストがどれかに基づいて、NGINX が要求をserver1.example.comまたはserver2.example.comに送信することを定義します。NGINX は、他の 2 つのホストが利用できない場合は、server3.example.comのみをバックアップとして使用します。proxy_passディレクティブをhttp://backendに設定すると、NGINX はリバースプロキシーとして機能し、backendホストグループを使用して、このグループの設定に基づいて要求を分散します。least_conn負荷分散メソッドの代わりに、以下を指定できます。- ラウンドロビンを使用し、サーバー全体で要求を均等に分散する方法はありません。
-
ip_hash: クライアントの IPv4 アドレスの最初の 3 オクテット、または IPv6 アドレス全体から計算されたハッシュに基づいて、同じクライアントアドレスからの要求を同じサーバーに送信できます。 -
hash: ユーザーが定義したキーに基づいてサーバーを決定します。キーは文字列、変数、またはその両方の組み合わせを指定できます。consistentパラメーターは、ユーザー定義のハッシュ化された鍵の値に基づいて、NGINX がすべてのサーバーに要求を分散するように設定します。 -
random: ランダムに選択されたサーバーにリクエストを送信します。
nginxサービスを再起動します。# systemctl restart nginx
第6章 Squid キャッシングプロキシーサーバーの設定 リンクのコピーリンクがクリップボードにコピーされました!
帯域幅を削減し、Web ページを高速に読み込むには、Squid を使用します。これは、HTTP、HTTPS、FTP プロトコルのプロキシーとして機能し、アクセス認証と制限を可能にするキャッシングプロキシーサーバーです。詳細は、/usr/share/doc/squid/squid.conf.documented にある設定パラメーターを参照してください。
6.1. 認証なしで Squid をキャッシングプロキシーとして設定 リンクのコピーリンクがクリップボードにコピーされました!
コンテンツキャッシュを利用して帯域幅効率と応答時間を向上させつつ、ユーザーのアクセスを簡素化するために、Squid を認証なしのキャッシュプロキシーとして設定します。IP 範囲のみに基づいてプロキシーへのアクセスを制限する必要があります。
前提条件
-
squidパッケージに/etc/squid/squid.confファイルが含まれている。以前にこのファイルを編集した場合は、パッケージを削除して再インストールしてください。
手順
squidパッケージをインストールします。# dnf install squid/etc/squid/squid.confファイルを編集します。# vi /etc/squid/squid.confプロキシーへのアクセスを許可する IP アドレス範囲に合わせて、
localnetのアクセス制御リスト (ACL) を調整します。acl localnet src 192.0.2.0/24 acl localnet 2001:db8:1::/64デフォルトでは、
/etc/squid/squid.confファイルにhttp_access allow localnetルールが含まれています。このルールは、localnetACL で指定されたすべての IP 範囲のプロキシーを使用します。http_access allow localnetルールの前に、すべてのlocalnetACL を指定する必要があります。重要環境に一致しない既存の
acl localnetエントリーをすべて削除します。他のポートで HTTPS プロトコルを使用できるようにするには、以下の各ポートに対して ACL を追加します。
acl SSL_ports port port_number以下の ACL はデフォルト設定にあり、HTTPS プロトコルを使用するポートとして
443を定義します。acl SSL_ports port 443Squid が接続を確立できるポートに設定する
acl Safe_portsルールの一覧を更新します。acl Safe_ports port 21 acl Safe_ports port 80 acl Safe_ports port 443たとえば、クライアントがプロキシー経由でポート
21(FTP)、80(HTTP)、443(HTTPS) のリソースにのみアクセスできるように設定するには、設定ファイルに次のacl Safe_portsステートメントのみを残します。デフォルトでは、設定ファイルには、Safe_portsACL で定義されていないポートへのアクセスを拒否するhttp_access deny !Safe_portsルールが含まれています。cache_dirパラメーターにキャッシュの種類、キャッシュディレクトリーへのパス、キャッシュサイズ、さらにキャッシュの種類ごとの設定を設定します。cache_dir ufs /var/spool/squid 10000 16 256この設定により、以下が可能になります。
-
Squid は、
ufsキャッシュタイプを使用します。 -
Squid は、キャッシュを
/var/spool/squid/ディレクトリーに保存します。 -
キャッシュのサイズが
10000MB まで大きくなります。 -
Squid は、
16個のレベル 1 サブディレクトリーを/var/spool/squid/ディレクトリーに作成します。 Squid は、レベル 1 の各ディレクトリーに
256個のサブディレクトリーを作成します。cache_dirディレクティブを設定しないと、Squid はキャッシュをメモリーに保存します。
-
Squid は、
cache_dirパラメーターに/var/spool/squid/以外のキャッシュディレクトリーを設定する場合は、以下を行います。キャッシュディレクトリーを作成します。
# mkdir -p <path_to_cache_directory>キャッシュディレクトリーの権限を設定します。
# chown squid:squid <path_to_cache_directory>semanageユーティリティーが利用できない場合は、policycoreutils-python-utilsパッケージをインストールします。# dnf install policycoreutils-python-utilsSELinux が
enforcingモードの場合、キャッシュディレクトリーのsquid_cache_tコンテキストを設定します。# semanage fcontext -a -t squid_cache_t "<path_to_cache_directory>(/.)?"* # restorecon -Rv <path_to_cache_directory>
ファイアウォールで
3128ポートを開きます。# firewall-cmd --permanent --add-port=3128/tcp # firewall-cmd --reloadsquidサービスを有効にして開始します。# systemctl enable --now squid
検証
curlユーティリティーを使用して Web ページをダウンロードし、プロキシーが正しく機能していることを確認します。# curl -O -L "https://www.redhat.com/index.html" -x "proxy.example.com:3128"curlコマンドでエラーが表示されず、index.htmlファイルがカレントディレクトリーにダウンロードされている場合は、プロキシーは正常に動作しています。
6.2. LDAP 認証を使用したキャッシングプロキシーとしての Squid の設定 リンクのコピーリンクがクリップボードにコピーされました!
認証されたユーザーのみがプロキシーを使用できるようにするには、Squid を LDAP(Lightweight Directory Access Protocol) 認証を使用したキャッシングプロキシーとして設定します。
前提条件
-
squidパッケージがインストールされている。 -
squidパッケージに/etc/squid/squid.confファイルが含まれている。以前にこのファイルを編集した場合は、パッケージを削除して再インストールしてください。 -
LDAP ディレクトリーには
uid=proxy_user,cn=users,cn=accounts,dc=example,dc=comのようなサービスユーザーが存在します。Squid はこのアカウントを使用して認証ユーザーを検索します。認証ユーザーが存在する場合、Squid はこのユーザーをディレクトリーにバインドして認証を検証します。
手順
/etc/squid/squid.confファイルを編集します。basic_ldap_authヘルパーユーティリティーを設定するには、/etc/squid/squid.confに以下の設定エントリーを追加します。auth_param basic program /usr/lib64/squid/basic_ldap_auth -b "cn=users,cn=accounts,dc=example,dc=com" -D "uid=proxy_user,cn=users,cn=accounts,dc=example,dc=com" -W /etc/squid/ldap_password -f "(&(objectClass=person)(uid=%s))" -ZZ -H ldap://ldap_server.example.com:389-
-b base_DNは LDAP 検索ベースを設定します。 -
-D proxy_service_user_DNは、Squid が、ディレクトリー内の認証ユーザーを検索する際に使用するアカウントの識別名 (DN) を設定します。 -
-W path_to_password_fileは、プロキシーサービスユーザーのパスワードが格納されているファイルへのパスを設定します。パスワードファイルを使用すると、オペレーティングシステムのプロセスリストにパスワードが表示されなくなります。 -f LDAP_filterは、LDAP 検索フィルターを指定します。Squid は、%s変数を、認証ユーザーにより提供されるユーザー名に置き換えます。上記の例の
(&(objectClass=person)(uid=%s))フィルターは、ユーザー名がuid属性に設定された値と一致する必要があり、ディレクトリーエントリーにpersonオブジェクトクラスが含まれることを定義します。-ZZは、STARTTLSコマンドを使用して、LDAP プロトコルで TLS 暗号化接続を強制します。以下の状況で-ZZを省略します。- LDAP サーバーは、暗号化された接続に対応しません。
- URL で指定されているポートは、Lightweight Directory Access Protocol Secure (LDAPS) プロトコルを使用します。
- -H LDAP_URL パラメーターは、LDAP サーバーのプロトコル、ホスト名または IP アドレス、およびポートを URL 形式で指定します。
-
以下の Access Control List (ACL) およびルールを追加して、Squid で、認証されたユーザーのみがプロキシーを使用できるように設定します。
acl ldap-auth proxy_auth REQUIRED http_access allow ldap-auth重要http_access deny allルールの前にこの設定を指定します。次のルールを削除して、
localnetACL で指定された IP 範囲のプロキシー認証の回避を無効にします。http_access allow localnetユーザーが他のポートで HTTPS プロトコルを使用できるように、これらの各ポートに ACL を追加します。
acl SSL_ports port port_numberたとえば、以下の ACL はデフォルト設定にあり、HTTPS プロトコルを使用するポートとして
443を定義します。acl SSL_ports port 443Squid が接続を確立できるポートに設定する
acl Safe_portsルールの一覧を更新します。acl Safe_ports port 21 acl Safe_ports port 80 acl Safe_ports port 443デフォルトでは、設定には
http_access deny !Safe_portsルールが含まれ、Safe_portsACL で定義されていないポートへのアクセス拒否を定義します。たとえば、プロキシーの使用を許可されたクライアントがポート 21 (FTP)、80 (HTTP)、443 (HTTPS) のリソースにのみアクセスできるようにするには、その設定の以下のacl Safe_portsステートメントのみを保持します。cache_dirパラメーターにキャッシュの種類、キャッシュディレクトリーへのパス、キャッシュサイズ、さらにキャッシュの種類ごとの設定を設定します。cache_dir ufs /var/spool/squid 10000 16 256この設定により、以下が可能になります。
-
Squid は、
ufsキャッシュタイプを使用します。 -
Squid は、キャッシュを
/var/spool/squid/ディレクトリーに保存します。 -
キャッシュのサイズが
10000MB まで大きくなります。 -
Squid は、
16個のレベル 1 サブディレクトリーを/var/spool/squid/ディレクトリーに作成します。 Squid は、レベル 1 の各ディレクトリーに
256個のサブディレクトリーを作成します。cache_dirディレクティブを設定しないと、Squid はキャッシュをメモリーに保存します。
-
Squid は、
cache_dirパラメーターに/var/spool/squid/以外のキャッシュディレクトリーを設定する場合は、以下を行います。キャッシュディレクトリーを作成します。
# mkdir -p path_to_cache_directoryキャッシュディレクトリーの権限を設定します。
# chown squid:squid path_to_cache_directorySELinux を
enforcingモードで実行する場合は、squid_cache_tコンテキストをキャッシュディレクトリーに設定します。# semanage fcontext -a -t squid_cache_t "path_to_cache_directory(/.*)?" # restorecon -Rv path_to_cache_directorysemanageユーティリティーがシステムで利用できない場合は、policycoreutils-python-utilsパッケージをインストールします。
LDAP サービスユーザーのパスワードを
/etc/squid/ldap_passwordファイルに保存し、ファイルに適切なパーミッションを設定します。# echo "password" > /etc/squid/ldap_password # chown root:squid /etc/squid/ldap_password # chmod 640 /etc/squid/ldap_passwordファイアウォールで
3128ポートを開きます。# firewall-cmd --permanent --add-port=3128/tcp # firewall-cmd --reloadsquidサービスを有効にして開始します。# systemctl enable --now squid
検証
プロキシーが正しく動作していることを確認するには、次の Web ページをダウンロードします。
# curl -O -L "https://www.redhat.com/index.html" -x "user_name:password@proxy.example.com:3128"curl がエラーを表示せず、
index.htmlファイルが現在のディレクトリーにダウンロードされている場合は、プロキシーが動作します。
トラブルシューティング
ヘルパーユーティリティーが正しく機能していることを確認するには、以下の手順を行います。
auth_paramパラメーターで使用したのと同じ設定で、ヘルパーユーティリティーを手動で起動します。# /usr/lib64/squid/basic_ldap_auth -b "cn=users,cn=accounts,dc=example,dc=com" -D "uid=proxy_user,cn=users,cn=accounts,dc=example,dc=com" -W /etc/squid/ldap_password -f "(&(objectClass=person)(uid=%s))" -ZZ -H ldap://ldap_server.example.com:389有効なユーザー名とパスワードを入力し、
Enterを押します。user_name passwordヘルパーユーティリティーが
OKを返すと、認証に成功しました。
6.3. Kerberos 認証を使用して Squid をキャッシングプロキシーとして設定する リンクのコピーリンクがクリップボードにコピーされました!
Kerberos を使用して Active Directory (AD) へのユーザー認証を行うには、Squid をキャッシュプロキシーとして設定します。認証済みのユーザーのみがプロキシーを使用できます。
前提条件
-
squidパッケージに/etc/squid/squid.confファイルが含まれている。以前にこのファイルを編集した場合は、パッケージを削除して再インストールしてください。 - Squid をインストールするサーバーが、AD ドメインのメンバーである。
手順
パッケージをインストールします。
# dnf install squid krb5-workstationAD ドメイン管理者として認証します。
# kinit administrator@AD.EXAMPLE.COMSquid 用のキータブを作成し、
/etc/squid/HTTP.keytabファイルに保存し、HTTPサービスプリンシパルをキータブに追加します。# export KRB5_KTNAME=FILE:/etc/squid/HTTP.keytab # net ads keytab CREATE -U administrator # net ads keytab ADD HTTP -U administratorオプション: システムが最初にレルムを使用して AD ドメインに参加している場合 (
adcli経由)、HTTPプリンシパルを追加し、Squid 用のキータブファイルを作成します。HTTPサービスプリンシパルをデフォルトのキータブファイル/etc/krb5.keytabに追加し、検証します。# adcli update -vvv --domain=ad.example.com --computer-name=PROXY --add-service-principal="HTTP/proxy.ad.example.com" -C # klist -kte /etc/krb5.keytab | grep -i HTTP/etc/krb5.keytabファイルをロードし、HTTP以外のすべてのサービスプリンシパルを削除し、残りのプリンシパルを/etc/squid/HTTP.keytabファイルに保存します。# ktutil ktutil: rkt /etc/krb5.keytab ktutil: l -e slot | KVNO | Principal ----------------------------------------------------------------------------- 1 | 2 | PROXY$@AD.EXAMPLE.COM (aes128-cts-hmac-sha1-96) 2 | 2 | PROXY$@AD.EXAMPLE.COM (aes256-cts-hmac-sha1-96) 3 | 2 | host/PROXY@AD.EXAMPLE.COM (aes128-cts-hmac-sha1-96) 4 | 2 | host/PROXY@AD.EXAMPLE.COM (aes256-cts-hmac-sha1-96) 5 | 2 | host/proxy.ad.example.com@AD.EXAMPLE.COM (aes128-cts-hmac-sha1-96) 6 | 2 | host/proxy.ad.example.com@AD.EXAMPLE.COM (aes256-cts-hmac-sha1-96) 7 | 2 | HTTP/proxy.ad.example.com@AD.EXAMPLE.COM (aes128-cts-hmac-sha1-96) 8 | 2 | HTTP/proxy.ad.example.com@AD.EXAMPLE.COM (aes256-cts-hmac-sha1-96)ktutilの対話型ターミナルでは、以下のように、さまざまなオプションを使用して、キータブから不要なプリンシパルをすべて削除できます。ktutil: delent 1ktutil: l -e slot | KVNO | Principal ------------------------------------------------------------------------------- 1 | 2 | HTTP/proxy.ad.example.com@AD.EXAMPLE.COM (aes128-cts-hmac-sha1-96) 2 | 2 | HTTP/proxy.ad.example.com@AD.EXAMPLE.COM (aes256-cts-hmac-sha1-96) ktutil: wkt /etc/squid/HTTP.keytab ktutil: q警告System Security Services Daemon (SSSD) または Samba/winbind がマシンアカウントのパスワードを更新すると、
/etc/krb5.keytab内のキーが更新される可能性があります。アップデート後、/etc/squid/HTTP.keytab内のキーが機能しなくなる場合があり、その場合はktutilの手順を再度実行して新しいキーを keytab にコピーする必要があります。
キータブファイルの所有者を
squidユーザーに設定します。# chown squid /etc/squid/HTTP.keytabオプション: キータブファイルに、プロキシーサーバーの完全修飾ドメイン名 (FQDN) に対応する
HTTPサービスプリンシパルが含まれていることを確認します。# klist -k /etc/squid/HTTP.keytab Keytab name: FILE:/etc/squid/HTTP.keytab KVNO Principal ---- ------------------- ... 2 HTTP/proxy.ad.example.com@AD.EXAMPLE.COM .../etc/squid/squid.confファイルを編集します。negotiate_kerberos_authヘルパーユーティリティーを設定するには、/etc/squid/squid.conf部に以下の設定エントリーを追加します。auth_param negotiate program /usr/lib64/squid/negotiate_kerberos_auth -k /etc/squid/HTTP.keytab -s HTTP/proxy.ad.example.com@AD.EXAMPLE.COM以下は、
negotiate_kerberos_authヘルパーユーティリティーに渡されるパラメーターを説明します。-
-k fileは、キータブファイルへのパスを設定します。squid ユーザーには、このファイルに対する読み取り権限があることに注意してください。 -s HTTP/host_name@kerberos_realmは、Squid が使用する Kerberos プリンシパルを設定します。必要に応じて、以下のパラメーターのいずれかまたは両方をヘルパーユーティリティーに渡すことによりロギングを有効にできます。
-
-iは、認証ユーザーなどの情報メッセージをログに記録します。 -dは、デバッグロギングを有効にします。Squid は、ヘルパーユーティリティーから、
/var/log/squid/cache.logファイルにデバッグ情報のログに記録します。
-
以下の Access Control List (ACL) およびルールを追加して、Squid で、認証されたユーザーのみがプロキシーを使用できるように設定します。
acl kerb-auth proxy_auth REQUIRED http_access allow kerb-auth重要http_access deny allルールの前にこの設定を指定します。次のルールを削除して、
localnetACL で指定された IP 範囲のプロキシー認証の回避を無効にします。http_access allow localnetユーザーが他のポートでも HTTPS プロトコルを使用できるようにするには、ポートごとに ACL を追加します。
acl SSL_ports port port_numberたとえば、以下の ACL はデフォルト設定にあり、HTTPS プロトコルを使用するポートとして
443を定義します。acl SSL_ports port 443Squid が接続を確立できるポートに設定する
acl Safe_portsルールの一覧を更新します。たとえば、プロキシーを使用するクライアントがポート 21 (FTP)、80 (HTTP)、443 (HTTPS) のリソースにのみアクセスできるようにするには、その設定の以下のacl Safe_portsステートメントのみを保持します。acl Safe_ports port 21 acl Safe_ports port 80 acl Safe_ports port 443デフォルトでは、設定には、
Safe_portsACL で定義されていないポートへのアクセスを拒否するhttp_access deny !Safe_portsルールが含まれています。cache_dirパラメーターにキャッシュの種類、キャッシュディレクトリーへのパス、キャッシュサイズ、さらにキャッシュの種類ごとの設定を設定します。cache_dir ufs /var/spool/squid 10000 16 256この設定により、以下が可能になります。
-
Squid は、
ufsキャッシュタイプを使用します。 -
Squid は、キャッシュを
/var/spool/squid/ディレクトリーに保存します。 -
キャッシュのサイズが
10000MB まで大きくなります。 -
Squid は、
16個のレベル 1 サブディレクトリーを/var/spool/squid/ディレクトリーに作成します。 Squid は、レベル 1 の各ディレクトリーに
256個のサブディレクトリーを作成します。cache_dirディレクティブを設定しないと、Squid はキャッシュをメモリーに保存します。
-
Squid は、
cache_dirパラメーターに/var/spool/squid/以外のキャッシュディレクトリーを設定する場合は、以下を行います。キャッシュディレクトリーを作成します。
# mkdir -p path_to_cache_directoryキャッシュディレクトリーの権限を設定します。
# chown squid:squid path_to_cache_directorySELinux を
enforcingモードで実行する場合は、squid_cache_tコンテキストをキャッシュディレクトリーに設定します。# semanage fcontext -a -t squid_cache_t "path_to_cache_directory(/.*)?" # restorecon -Rv path_to_cache_directorysemanageユーティリティーがシステムで利用できない場合は、policycoreutils-python-utilsパッケージをインストールします。
ファイアウォールで
3128ポートを開きます。# firewall-cmd --permanent --add-port=3128/tcp # firewall-cmd --reloadsquidサービスを有効にして開始します。# systemctl enable --now squid
検証
プロキシーが正しく機能することを確認するには、
curlユーティリティーを使用して Web ページをダウンロードします。# curl -O -L "https://www.redhat.com/index.html" --proxy-negotiate -u : -x "proxy.ad.example.com:3128"curlがエラーを表示せず、index.htmlファイルが現在のディレクトリーに存在すると、プロキシーが機能します。
トラブルシューティングの手順
AD アカウントの Kerberos チケットを取得します。
# kinit user@AD.EXAMPLE.COMオプション: チケットを表示します。
# klistnegotiate_kerberos_auth_testユーティリティーを使用して認証をテストします。# /usr/lib64/squid/negotiate_kerberos_auth_test proxy.ad.example.comヘルパーユーティリティーがトークンを返す場合は、認証に成功しました。
Token: YIIFtAYGKwYBBQUCoIIFqDC...
6.4. Squid でのドメイン拒否リストの設定 リンクのコピーリンクがクリップボードにコピーされました!
特定のドメインへのアクセスをブロックするには、Squid でドメイン拒否リストを設定します。悪意のあるドメインやスパムドメインをブロックする場合に便利です。
前提条件
- Squid がキャッシュプロキシーとして設定されている (ユーザーはプロキシーを使用できます)。
手順
/etc/squid/squid.confファイルで以下の設定を編集します。acl domain_deny_list dstdomain "/etc/squid/domain_deny_list.txt" http_access deny all domain_deny_list重要ユーザーまたはクライアントへのアクセスを許可する最初の
http_access allowステートメントの前にこれらのエントリーを追加します。/etc/squid/domain_deny_list.txtファイルを作成し、ブロックするドメインを追加します。たとえば、example.com(サブドメインを含む) へのアクセスをブロックし、example.netのみをブロックするには、以下を追加します。.example.com example.net重要squid 設定の
/etc/squid/domain_deny_list.txtファイルを参照している場合は、このファイルは空にすることはできません。このファイルが空の場合、Squid は起動できません。squidサービスを再開します。# systemctl restart squid
6.5. Squid サービスが特定のポートまたは IP アドレスをリッスンするように設定 リンクのコピーリンクがクリップボードにコピーされました!
Squid サービスが特定のポートまたは IP アドレスでリッスンするように設定するには、/etc/squid/squid.conf ファイルを編集します。デフォルトでは、Squid プロキシーサービスは、すべてのネットワークインターフェイスの 3128 ポートでリッスンします。
前提条件
-
squidパッケージがインストールされている。
手順
/etc/squid/squid.confファイルを編集します。Squid サービスがリッスンするポートを設定するには、
http_portパラメーターにポート番号を設定します。たとえば、ポートを8080に設定するには、次のように入力します。http_port 8080Squid サービスがリッスンする IP アドレスを設定するには、
http_portパラメーターに IP アドレスとポート番号を設定します。たとえば、Squid が IP アドレス192.0.2.1のポート3128でのみリッスンするように設定するには、次のように入力します。http_port 192.0.2.1:3128複数の
http_portパラメーターを設定ファイルに追加して、Squid が複数のポートおよび IP アドレスでリッスンするように設定します。http_port 192.0.2.1:3128http_port 192.0.2.1:8080
Squid がデフォルトの
3128番ポートとは異なるポートを使用するように設定した場合、以下を実行します。ファイアウォールのポートを開きます。
# firewall-cmd --permanent --add-port=port_number/tcp# firewall-cmd --reloadsemanageユーティリティーを使用するには、policycoreutils-python-utilsパッケージをインストールします。# dnf install policycoreutils-python-utilsenforcing モードで SELinux を実行した場合は、ポートを
squid_port_tポートタイプ定義に割り当てます。# semanage port -a -t squid_port_t -p tcp <port_number>
squidサービスを再開します。# systemctl restart squid