忍者ブログ

ブランクがあるインフラエンジニアの備忘録

サーバ構築のメモ

NginxによるWebサーバー構築(ヴァーチャルホスト及びベーシック認証)

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

NginxによるWebサーバー構築(ヴァーチャルホスト及びベーシック認証)

◇本稿の構成。
〇Nginx(Web)サーバー
・ホスト名:nginx1.stream.server
・アドレス:192.168.128.103/24
・DNS:192.168.128.101
・ゲートウェイ:192.168.128.1
〇DNSサーバー
・ホスト名:host1.stream.server
・アドレス:192.168.128.101/24
・DNS:192.168.128.101
・ゲートウェイ:192.168.128.1
〇クライアント(出来れば準備)
・ホスト名:client
・アドレス:192.168.128.110/24
・DNS:192.168.128.101
・ゲートウェイ:192.168.128.1
 3台仮想マシンを起動するのが困難な環境の場合、DNSサーバーをクライアントの代わりに使用しても構いません。
◇DNSサーバーの追加設定
・DNSサーバーの正引きゾーンファイルの設定追加。
 nginx1とnginx2を追記します。
[root@host1 ~]# cp -p /var/named/stream.server.zone{,.20220622}
[root@host1 ~]# vi /var/named/stream.server.zone
$TTL 86400
@       IN SOA  host1.stream.server. root.stream.server. (
           0       ; serial
           1D      ; refresh
           1H      ; retry
           1W      ; expire
           3H )    ; minimum
   IN      NS      host1.stream.server.
   IN      MX      10      mail1.stream.server.
   IN      MX      20      mail2.stream.server.
host1   IN      A       192.168.128.101
host2   IN      A       192.168.128.102
mail1   IN      A       192.168.128.101
mail2   IN      A       192.168.128.102
web1   IN      A       192.168.128.100
nginx1  IN      A       192.168.128.103
nginx2  IN      A       192.168.128.103
・DNSサーバーの逆引きファイルを追加
 nginx1.stream.server及びnginx2.stream.serverを追記します。
[root@host1 ~]# cp -p /var/named/128.168.192.in-addr.arpa.zone{,.20220622}
[root@host1 ~]# vi /var/named/128.168.192.in-addr.arpa.zone
$TTL 86400
@       IN SOA  host1.stream.server. root.stream.server. (
           0       ; serial
           1D      ; refresh
           1H      ; retry
           1W      ; expire
           3H )    ; minimum
   IN      NS      host1.stream.server.
   IN      A       255.255.255.0
101     IN      PTR     host1.stream.server.
102     IN      PTR     host2.stream.server.
101     IN      PTR     mail1.stream.server.
102     IN      PTR     mail2.stream.server.
100     IN      PTR     web1.stream.server.
103     IN      PTR     nginx1.stream.server.
103     IN      PTR     nginx2.stream.server.
[root@host1 ~]# named-checkconf -z
zone localhost.localdomain/IN: loaded serial 0
zone localhost/IN: loaded serial 0
zone 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa/IN: loaded serial 0
zone 1.0.0.127.in-addr.arpa/IN: loaded serial 0
zone 0.in-addr.arpa/IN: loaded serial 0
zone stream.server/IN: loaded serial 0
zone 128.168.192.in-addr.arpa/IN: loaded serial 0
[root@host1 ~]# systemctl reload named-chroot.service
[root@host1 ~]# systemctl is-active named-chroot.service
active
◇Nginxサーバーの設定
・nginxのインストール
[root@nginx1 ~]# dnf install -y nginx iproute
メタデータの期限切れの最終確認: 0:05:14 時間前の 2022年06月22日 22時45分17秒 に 実施しました。
パッケージ iproute-5.13.0-5.el9.x86_64 は既にインストールされています。
依存関係が解決しました。
================================================================================
 パッケージ              Arch        バージョン            リポジトリー   サイズ
================================================================================
インストール:
 nginx                   x86_64      1:1.20.1-10.el9       appstream      603 k
依存関係のインストール:
 centos-logos-httpd      noarch      90.4-1.el9            appstream      252 k
 nginx-filesystem        noarch      1:1.20.1-10.el9       appstream       12 k
(中略)
インストール済み:
  centos-logos-httpd-90.4-1.el9.noarch         nginx-1:1.20.1-10.el9.x86_64
  nginx-filesystem-1:1.20.1-10.el9.noarch
完了しました!
・サービスの起動
[root@nginx1 ~]# systemctl restart nginx
[root@nginx1 ~]# systemctl is-active nginx
active
[root@nginx1 ~]# systemctl enable nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
[root@nginx1 ~]# systemctl is-enabled nginx
enabled
・ファイアウォールの設定
[root@nginx1 ~]# firewall-cmd --add-service=http --permanent
success
・SELinuxの設定
[root@nginx1 ~]# setsebool -P httpd_can_network_connect on
・動作確認用のhtmlファイル作成
[root@nginx1 ~]# echo "Hello Nginx Server." > /usr/share/nginx/html/nginxsite.html
・Nginxサーバーからnginxの動作確認
 apacheと同じく、FirefoxなどWebブラウザで動作確認可能ですが、簡単なテキストの場合、以下の様にコマンドで確認する事も可能です。
[root@nginx1 ~]# curl http://nginx1.stream.server/nginxsite.html
Hello Nginx Server.
・クライアント側からnginxの動作確認
 クライアント側からもサーバーと同じ様にコマンドで動作確認する事が可能です。
[root@client ~]# curl http://nginx1.stream.server/nginxsite.html
Hello Nginx Server.
◇バーチャルホストの設定
・ヴァーチャルホスト設定ファイルの作成
[root@nginx1 ~]# vi /etc/nginx/conf.d/vhost.conf
・テスト用のフォルダ及びHTMLファイルの作成
[root@nginx1 ~]# mkdir -p /var/www/{nginx1,nginx2}
[root@nginx1 ~]# echo "NGINX1" > /var/www/nginx1/index.html
[root@nginx1 ~]# echo "NGINX2" > /var/www/nginx2/index.html
[root@nginx1 ~]# vi /etc/nginx/conf.d/vhost.conf
server {
  listen  80;
  server_name nginx1.stream.server;
  location / {
    root /var/www/nginx1;
    index index.html;
  }
}
server {
  listen  80;
  server_name nginx2.stream.server;
  location / {
    root /var/www/nginx2;
    index index.html;
  }
}
・構成のテスト
[root@nginx1 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
・サービスの起動
[root@nginx1 ~]# systemctl restart nginx.service
[root@nginx1 ~]# systemctl is-active nginx.service
active
・ファイアウォールの設定
[root@nginx1 ~]# firewall-cmd --zone=public --add-service=http --permanent
success
[root@nginx1 ~]# firewall-cmd --reload
success
・Nginxサーバーから動作確認
[root@nginx1 ~]# curl http://nginx1.stream.server/index.html
NGINX1
[root@nginx1 ~]# curl http://nginx2.stream.server/index.html
NGINX2
・クライアントマシンから動作確認
[root@client ~]# curl http://nginx1.stream.server/index.html
NGINX1
[root@client ~]# curl http://nginx2.stream.server/index.html
NGINX2
 以上でヴァーチャルホストの設定が出来ました。
 続いて、ベーシック認証の設定を行います。
◇ベーシック認証
・httpd-toolsのインストール
[root@nginx1 ~]# dnf install -y httpd-tools
・ベーシック認証テスト用ディレクトリ及びHTMLファイル作成
[root@nginx1 ~]# mkdir /var/www/nginx2/private01
[root@nginx1 ~]# echo "Basic Auth Success!" > /var/www/nginx2/private01/index.html
[root@nginx1 ~]# cp -p /etc/nginx/conf.d/vhost.conf{,.20220624}
[root@nginx1 ~]# vi /etc/nginx/conf.d/vhost.conf
server {
  listen  80;
  server_name nginx1.stream.server;
  location / {
    root /var/www/nginx1;
    index index.html;
  }
}
server {
  listen  80;
  server_name nginx2.stream.server;
  location / {
    root /var/www/nginx2;
    index index.html;
    auth_basic      "Basic Auth";           #←追記
    auth_basic_user_file    "/etc/nginx/.htpasswd";  #←追記
  }
}
・構成のテスト
[root@nginx1 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
・ベーシック認証のパスワード作成
[root@nginx1 ~]# htpasswd -c /etc/nginx/.htpasswd testuser01
New password:     #←新規パスワード入力
Re-type new password:  #←新規パスワード入力
Adding password for user testuser01
・サービスの再起動
[root@nginx1 ~]# systemctl restart nginx
・ベーシック認証のテスト
 クライアントマシンのGUI画面で一般ユーザーで端末を起動し、以下のコマンドでfirefoxを起動し、ベーシック認証のディレクトリへアクセスします。
[root@client ~]# firefox http://nginx2.stream.server/private01/index.html
 上記コマンド入力後、ブラウザが起動し、ユーザー認証画面が表示されるので、以下を入力します。
ユーザー名:testuser01
パスワード:testuser01
 ブラウザに「Basic Auth Success!」と表示されればベーシック認証は成功です。
◇Nginxサーバーの暗号化
・mod-sslのインストール。
 SSL/TLS化するにはmod-sslというツールを使用します。以下の方法でインストールを行いましょう。
[root@nginx1 ~]# dnf install -y mod_ssl
・自己署名証明書
 SSL/TLSによる暗号化通信では証明書が必要な為、サーバー証明書を作成します。テスト用の為、自己署名証明書を利用します。
[root@nginx1 ~]# NAME=nginx1.stream.server
 以下のコマンドは改行せず一行で入力してください。
[root@nginx1 ~]# openssl req -x509 -days 36500 -newkey rsa:2048 -nodes -out ${NAME}.crt -keyout ${NAME}.key -subj "/C=JP/ST=Tokyo/L=null/O=null/OU=null/CN=${NAME}/"
 コマンド実行後、実際に自己証明書ファイルが作成されているか確認し、中身も確認出来たらファイルを移動します。
[root@nginx1 ~]#  ls *.crt *.key
nginx1.stream.server.crt  nginx1.stream.server.key
[root@nginx1 ~]# openssl x509 -text -noout -in nginx1.stream.server.crt
Certificate:
 Data:
  Version: 3 (0x2)
  Serial Number:
   2f:e7:d1:4e:60:ec:0e:52:0e:24:f1:99:8d:b0:95:e1:47:dd:6e:54
  Signature Algorithm: sha256WithRSAEncryption
  Issuer: C = JP, ST = Tokyo, L = null, O = null, OU = null, CN = nginx1.stream.server
(略)
[root@nginx1 ~]# mv nginx1.stream.server.crt /etc/pki/tls/certs/
[root@nginx1 ~]# mv nginx1.stream.server.key /etc/pki/tls/private/
◇HTTPS転送の設定
[root@nginx1 ~]# cp -p /etc/nginx/nginx.conf{,.org}
[root@nginx1 ~]# vi /etc/nginx/nginx.conf
(略)
# Settings for a TLS enabled server.
##以下の項目の#を消してTLSを有効化してください
 server {
  listen       443 ssl http2;
  listen       [::]:443 ssl http2;
  server_name  nginx1.stream.server; ←ホスト名記載
(略)
  ssl_certificate "/etc/pki/tls/certs/nginx1.stream.server.crt";
  ssl_certificate_key "/etc/pki/tls/private/nginx1.stream.server.key";
  ssl_session_cache shared:SSL:1m;
  ssl_session_timeout  10m;
  ssl_ciphers PROFILE=SYSTEM;
  ssl_prefer_server_ciphers on;
(略)
 }
}
・ファイアウォールの設定
[root@nginx1 ~]# firewall-cmd --add-service=https --permanent
success
・Nginxの再起動
[root@nginx1 ~]# systemctl restart nginx
Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xeu nginx.service" for details.
 上記の様なメッセージが表示され、起動できません。
 Nginxのエラーログを確認すると、パーミッションで拒否が発生しています。
[root@nginx1 ~]# tail /var/log/nginx/error.log
2022/06/25 20:41:21 [emerg] 3558#3558: cannot load certificate "/etc/pki/tls/certs/nginx1.stream.server.crt": BIO_new_file() failed (SSL: error:8000000D:system library::Permission denied:calling fopen(/etc/pki/tls/certs/nginx1.stream.server.crt, r) error:10080002:BIO routines::system lib)
 また、システムのログを確認すると、SELinuxによりnginx1.stream.server.crt が拒否されている事を確認出来ます。
[root@nginx1 ~]# tail /var/log/messages
Jun 25 20:49:11 nginx1 setroubleshoot[3602]: SELinux により、/usr/sbin/nginx に よる open アクセスが、ファイル /etc/pki/tls/certs/nginx1.stream.server.crt で拒 否されました。#012#012*****  プラグイン restorecon (99.5 信頼性) による示唆   ***********************************#012#012ラベルを修正する場合。#012/etc/pki/tls/certs/nginx1.stream.server.crt のデフォルトラベルは cert_t のはずです。#012この ようにします: restorecon を実行することができます。親ディレクトリーにアクセスす るのに必要な権限がないため、要求されたアクセスが停止した可能性があります。この場合は、以下のコマンドを状況に応じて適切に変更します。#012そして、以下を実行します: #012# /sbin/restorecon -v /etc/pki/tls/certs/nginx1.stream.server.crt#012#012*****  プラグイン catchall (1.49 信頼性) による示唆   *************************************#012#012nginx に、 nginx1.stream.server.crt file の open アクセスがデ フォルトで許可されるべきと考える場合。#012このようにします: バグとして報告してください。 #012ローカルのポリシーモジュールを生成すると、#012 このアクセスを許可することができます。#012そして、以下を実行します: #012以下を実行して、このアクセスを許可します:#012# ausearch -c 'nginx' --raw | audit2allow -M my-nginx#012# semodule -X 300 -i my-nginx.pp#012
 メッセージに従いラベルを修正します。
[root@nginx1 ~]# restorecon -v /etc/pki/tls/certs/nginx1.stream.server.crt
Relabeled /etc/pki/tls/certs/nginx1.stream.server.crt from unconfined_u:object_r:admin_home_t:s0 to unconfined_u:object_r:cert_t:s0
[root@nginx1 ~]# restorecon -v /etc/pki/tls/private/nginx1.stream.server.key
Relabeled /etc/pki/tls/private/nginx1.stream.server.key from unconfined_u:object_r:admin_home_t:s0 to unconfined_u:object_r:cert_t:s0
 次はポリシーモジュールを生成します。
[root@nginx1 ~]# ausearch -c 'nginx' --raw | audit2allow -M my-nginx
******************** 重要 ***********************
このポリシーパッケージを有効にするには、以下を実行して下さい:
semodule -i my-nginx.pp
[root@nginx1 ~]# semodule -X 300 -i my-nginx.pp
 上記作業終了後、サービスを再起動します。
[root@nginx1 ~]# systemctl restart nginx
[root@nginx1 ~]# systemctl is-active nginx
active
 これでNginxの再起動が出来ました。
・Nginxサーバーのブラウザからhttpsページへアクセス。
 続いてはhttps化したWebページへアクセス可能か検証を行う為に、Nginxサーバーの仮想マシン上のGUIからWebブラウザ(Firefox)を立ち上げ、URLに以下のアドレスを入力します。
https://nginx1.stream.server
 初めてアクセスした際、ブラウザが”Warning Potantial Security Risk Ahead.(警告:潜在的なリスクあり)”と警告を発します。
 ブラウザ上の”Advanced...(詳細情報)”をクリックし、ブラウザの下に移動し”Accept the Risk and Continue(危険性を承知で続行)”をクリックし、サイトにアクセスします。
 「NGINX1」が表示されれば成功です。URLがhttpsである事を必ず確認してください。
・クライアントマシンから動作確認。
 クライアントマシン(又はDNSサーバー)でも上記と同じ方法でhttps://nginx1.stream.serverにアクセスします。
 「NGINX1」が表示されれば成功です。URLがhttpsである事を必ず確認してください。
PR

コメント

プロフィール

HN:
のらくら
性別:
非公開
自己紹介:
介護と自身の手術でブランクが出来たインフラエンジニアの学習メモ。VirtualBOXで仮想サーバーを建て、GNS3でCiscoルーター&スイッチによるネットワークのエミュレーションもしています。GNS3ネットワーク内に仮想サーバーと連携させて、実際のネットワーク環境におけるサーバーをシミュレートする他、LinuC level3 300の対策もしています。

P R