Nginx Webサーバーは、世界で最も広く使用されている2つのWebサーバーの1つです。 15年前の創業以来、完璧なWebサーバーアプリケーションとしての地位を固めました。 Nginxは、Apacheよりも約2.5倍高速な優れたパフォーマンスで知られています。大量の静的アセットを処理するWebサイトに最適ですが、汎用Webサイトにも使用できます。かなり前にその使用目的を超えてしまい、現在ではリバースプロキシ、キャッシング、負荷分散、メディアストリーミングなどの多数のタスクに使用されています。
NginxWebサーバーに関する事実
NginxはEngine Xと発音されます 現代のWebシーンではさまざまなユースケースがあります。これは、Webサーバーとしての標準的な役割に加えて、マイクロサービス、クラウドコンピューティング、APIゲートウェイなどのさまざまなWebサービスに電力を供給するために使用できます。 Linuxまたは同様のUNIXシステムで実行されているNginxWebサーバーを想定して説明を続けます。
1。 Nginxの基本
技術的なトピックに進む前に、基本を正しく理解する必要があります。そこで、ここではNginxに関するいくつかの基本的なことを紹介します。このアプリケーションには、有料と無料のバリエーションなど、いくつかのフレーバーがあります。ただし、オープンソースのNginxサーバーは、考えられるほぼすべての機能を提供し、値札が付いていないという理由だけで、開発者によって最も使用されています。
インストールしたら、サーバーを起動するためにsudo serviceNginxstartを実行できます。サーバー構成ファイルは、 / usr / local / nginx / conf /のいずれかに保存されます。 または/etc / nginx / ディレクトリ。 Webドキュメントは、 / usr / local / nginx / html /のいずれかに保存されます。 または/var / www / html ディレクトリ。コマンドsudonginx -s を発行すると、実行中のサーバーを停止できます。 停止します。
2。 SELinuxをオンにする
SELinux(Security-Enhanced Linux)は、Linuxカーネルの魅力的な機能であり、アクセス制御セキュリティポリシーを介してシステムセキュリティをより詳細に制御できます。専用のウェブサーバーを実行する予定のシステムでSELinuxを有効にするのが一般的な方法です。 getsebool -aを利用する必要があります このためのコマンド。
$ sudo getsebool -a | less $ sudo getsebool -a | grep off $ sudo getsebool -a | grep on
上記のコマンドは、どのブール設定がオンまたはオフになっているかについての情報を提供します。最大限のセキュリティを確保するには、システムに必要のないすべてのエンティティを無効にする必要があります。これらの設定は、まとめてSELinuxブール値と呼ばれます。これらの変数に適切な値を設定すると、システムがはるかに安全になり、標準のWeb攻撃を防ぐことができます。
3。不要なNginxモジュールの削除
---Nginxデフォルトサーバーは軽量であるにもかかわらず、サーバーに不要なモジュールを削除することをお勧めします。これにより、メモリフットプリントが大幅に最小化され、サーバーが通常よりも高速になります。さらに、サーバーの多くの機能が制限されるため、悪意のあるユーザーがサーバーにアクセスしたとしても、システム自体を完全に制御するには多くの時間とスキルが必要になります。
以下のコマンドは、SSIと、Nginxバイナリでデフォルトでインストールされている自動インデックスモジュールを無効にする方法を示しています。
sudo ./configure --without-http_autoindex_module --without-http_ssi_module sudo make sudo make install
次のコマンドを使用して、Nginxサーバーのコンパイル時にオフにできるモジュールを表示できます。
sudo ./configure --help | less
4。ネットワーキング特権の最小化
Webサーバーのネットワーク特権を最小限に抑えることも、セキュリティの向上に役立ちます。このジョブのマウントオプションを活用できます。基本的に、これは、個別のパーティションを介してすべてのWebページを提供できることを意味します。これを行うには、追加のパーティションを作成し、それらを / nginxにマウントする必要があります 位置。必ずnoexec、nodev、およびnosetuid権限でマウントしてください。
これを行うには、ファイル / etc / fstabを編集します。 。これをお気に入りのエディターで編集し、ファイルの最後に以下を追加します。
LABEL=/nginx /nginx ext3 defaults,nosuid,noexec,nodev 1 2
システムが別のファイルシステムで実行されている場合は、ext3をそのファイルシステムの名前に置き換えます。これを行うには、sudo権限が必要です。
5。 Nginxのネットワーク設定を強化する
カーネルとネットワークの設定を構成することで、システムのセキュリティをさらに強化できます。 / etc/sysctlを編集します。 confファイルを作成し、次の行を追加してサーバーのシステムを強化します。
# prevent smurf attacks net.ipv4.icmp_echo_ignore_broadcasts = 1 # stopping being a router net.ipv4.ip_forward = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 # prevent alteration of routing tables net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.secure_redirects = 0 net.ipv4.conf.default.secure_redirects = 0
システムを保護するために使用できるオプションは多数あります。誰かがサーバーのセキュリティを侵害した場合に役立ちます。
6。 Nginxバージョンヘッダーの変更
Nginxのデフォルトサーバーのバージョンヘッダーを変更することは、ハッカーになりたがっている人がシステムに侵入するのを防ぐための優れた方法です。多くのアプリケーションには、サーバーソフトウェアのバージョンヘッダーを取得するためのファジーデータを供給することができます。悪意のあるユーザーは、特定の脆弱性を標的にして掘り下げることができるように、正確なサーバー情報を見つけるためにこれを行うことがよくあります。
ファイルsrc/ http / ngx_http_header_filter_module.cから以下の行を見つけます 。
static char ngx_http_server_string[] = "Server: nginx" CRLF; static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
次の行に置き換えてください。
static char ngx_http_server_string[] = "Server: Ninja Web Server" CRLF; static char ngx_http_server_full_string[] = "Server: Ninja Web Server" CRLF;
これは、潜在的な攻撃者にサーバーのバージョンに関する誤った情報を示しています。
7。バッファオーバーフローの防止
バッファオーバーフローは、コードスニペットがその境界を超えてデータを書き込むときに発生します。これは、経験豊富なハッカーが利用する古典的なソフトウェアエンジニアリングの問題です。うまく考案された場合、バッファオーバーフロー攻撃により、不要な関係者がシステムに侵入して制御できるようになる可能性があります。すべてのクライアントのバッファサイズを制限することで、これらの攻撃を大幅に防ぐことができます。 nginx.confに以下を追加します ファイル。
# limit buffer sizes client_body_buffer_size 1K; client_header_buffer_size 1k; client_max_body_size 1k; large_client_header_buffers 2 1k; # set timeouts client_body_timeout 10; client_header_timeout 10; keepalive_timeout 5 5; send_timeout 10;
これらのオプションは、基本的にこれらのパラメーターのデフォルト値を変更し、攻撃対象領域を減らします。彼らと遊んで、NginxWebサーバーに適したものを見つけることができます。
8。同時接続の制御
Nginxのデフォルトサーバーを実行している場合でも、他のサーバーを実行している場合でも、同時接続の数を制限することをお勧めします。これは、サービス拒否攻撃の防止や負荷分散の改善など、多くの状況で役立ちます。 NginxHttpLimitZoneモジュールを使用すると、管理者は特定のセッションまたはIPアドレスの同時接続を制限できます。
limit_zone slimits $binary_remote_addr 5m; limit_conn slimits 5;
上記の行をnginx.confに追加します ファイル。許可される同時接続の数は、IPごとに5つに制限されます。この値は、要件に合わせて簡単に置き換えることができます。
9。ドメインアクセスのフィルタリング
最新のNginxWebサーバーが直面する最も一般的なタイプの問題の1つは、ボットネットです。多くの場合、サーバーをランダムにスキャンし、関連するすべてのドメインを見つけようとします。 nginx.conf に次の行を追加することで、簡単に拒否できます。 ファイル。
# encompass client requests to specified domains if ($host !~ ^(url.domain|www.url.domain|url.subdomain.domain)$ ) { return 444; }
これらの行をこのファイルに追加すると、指定されたドメインに対してのみクライアント要求が許可されます。または“ |” を使用して、複数のドメインを指定できます オペレーター。
10。利用可能なメソッドの制限
いくつかのHTTPがあります ユーザーの要求に基づいてWebページをフェッチするために使用されるメソッド。それらのいくつかはGET 、 POST 、 PUT 、および削除 。ただし、追加の方法がたくさんあります。ユーザーに対してこれらのメソッドを制限することは常に良い考えです。これは、不要なデータ侵害を減らすのに役立ち、セキュリティの層を追加します。 Nginx構成に次の行を追加します。
# allow only GET && HEAD && POST if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 444; }のみを許可
現在、ユーザーはサーバーで削除または検索リクエストを実行できません。 GETのみ 、 HEAD 、および POST メソッドが利用可能です。 HTTPメソッドの詳細については、こちらをご覧ください。
11。ユーザーエージェントの制限
ユーザーエージェントは、ユーザーがサービスと対話できるようにするコンピュータープログラムです。 Ubuntu Webブラウザーは、私のシステムの主要なWebユーザーエージェントです。
場合によっては、特定のユーザーのエージェントがWebサイトからデータをスクレイピングしようとしているヘッドレスブラウザのように、サーバーにアクセスすることを制限したい場合があります。これは、ボットネットが同じユーザーエージェントを使用することが多いため、ボットネットをブロックする場合にも役立ちます。
# block download agents if ($http_user_agent ~* LWP::Simple|BBBike|wget) { return 403; }
これらをNginx構成に追加すると、wgetやBBBikeなどの既知のダウンロードエージェントがブロックされます。以下の行は、 msnbotと呼ばれるいくつかの既知のロボットをブロックします およびscrapbot 。
#block robots if ($http_user_agent ~* msnbot|scrapbot) { return 403; }
必要なユーザーエージェントをブロックできます。ただし、注意してください。そうしないと、NginxWebサーバーへの正当なトラフィックがブロックされる可能性があります。
12。紹介スパムのブロック
紹介スパムは、今日多くのWebサーバーが直面している一般的な問題です。これは、特定のWebサイトを検索エンジンにアドバタイズして、サイトへのトラフィックを増やすために使用される手法です。サイトのランキングに深刻なダメージを与える可能性があるため、高負荷のWebサーバーにとっては特に危険です。ありがたいことに、Nginx構成に数行追加するだけで、これらのスパムのほとんどをブロックできます。
#deny certain referers if ( $http_referer ~* (babes|forsale|girl|jewelry|love|nudit|organic|poker|porn|sex|teen) ) { # return 404; return 403; }
上記の行をnginx.confに追加します 最も一般的な紹介スパムのいくつかをブロックするためのファイル。必要に応じて、これらの行に単語を追加できます。
13。画像のホットリンクを防ぐ
画像のホットリンクは、多くのWeb管理者にとって一般的な方法になっています。この方法では、管理者は多くの場合、Webサーバーからのパーソナライズされた画像を使用してクライアントの要求を処理します。 Webサーバーが、別のWebサーバーのユーザーから要求された画像アセットの配信を担当する可能性があるため、これを処理しないと、深刻な問題が発生する可能性があります。以下に示すように、これを簡単に防ぎ、貴重な帯域幅を節約できます。
# stop deep linking or image hotlinking location /images/ { valid_referers none blocked www.example.com example.com; if ($invalid_referer) { return 403; } }
これらの行をNginx構成ファイルに追加すると、前述のWebサーバーからの画像リクエストがブロックされます。このように、Nginxのデフォルトサーバーは、本物のクライアントリクエストにのみ画像を配信します。さらに、Nginxマップを使用して、多数のドメインの画像のホットリンクをブロックすることもできます。
14。ディレクトリアクセスの制限
多くの場合、ディレクトリを制限していないWebページがたくさんあります。悪意のあるユーザーは、必要に応じてサイトをトラバースでき、サイトの特権がさらにエスカレートすることが多いため、非常に脆弱です。以下のスニペットは、特定のユーザーをブロックし、特定のIP範囲を許可し、ディレクトリ / docs /に対する他のすべてを拒否する方法を示しています。 。
location /docs/ { # block one user deny 192.168.1.1; # allow anyone in 192.168.1.0/24 allow 192.168.1.0/24; # drop rest deny all; }
これらをNginx構成に追加し、 / docs /を置き換えます 機密情報を含むディレクトリを使用します。以下に示すように、パスワードでディレクトリを保護することもできます。まず、パスワードファイルを作成し、ユーザーを追加します
$ sudo mkdir /usr/local/nginx/conf/.htpasswd/ $ sudo htpasswd -c /usr/local/nginx/conf/.htpasswd/passwd USER
次に、これらの行を nginx.confに追加します ファイル。
# password rotect /personal-images/ and /delta/ directories location ~ /(personal-images/.*|delta/.*) { auth_basic "Restricted"; auth_basic_user_file /usr/local/nginx/conf/.htpasswd/passwd; }
15。 NginxWebサーバーのSSLの構成
SSL(Secure Sockets Layer)は、最新のWebサーバーの事実上のセキュリティ標準になっています。このテクノロジーを実装していないサイトは、多くのセキュリティ専門家にとって安全でないと見なされています。ありがたいことに、NginxサーバーのSSLセキュリティを構成および維持するのは簡単です。
WebサイトにSSLを設定する方法はたくさんあります。管理者は、自己署名SSL証明書を作成したり、一般的な認証局を使用したり、SSLリバースプロキシを設定したりできます。 Webサーバーの管理に比較的慣れていない場合は、人気のあるLet’sEncrypt認定を利用することをお勧めします。安全なSSL/TLS証明書を提供する無料で使いやすい認証局です。これを行う方法については、別のガイドで説明します。
16。 PHPのセキュリティを強化する
PHPは、最も使用されているサーバー側言語の1つであり、インターネット上でかなりの量のWebページを提供します。ただし、これは非常に古く、いくつかのセキュリティの脆弱性が発生する傾向があります。したがって、NginxサーバーでPHPを使用している場合は、常に注意を払い、特定のセキュリティ標準を実装する必要があります。たとえば、以下の行を /etc/php.iniに追加します。 ファイルは重要な要素によってセキュリティを強化します。
# reject crucial functions disable_functions = phpinfo, system, mail, exec # max execution time for scripts, in seconds max_execution_time = 30 # max memory limit for scripts, in MB memory_limit = 4M # max allowable POST data post_max_size = 4M # restrict PHP information expose_php = Off # log errors log_errors = On # enable SQL safe mode sql.safe_mode = On
サーバーを無害にするために、このファイルに追加できるセキュリティ強化の手順は他にもたくさんあります。
17。 Nginxデフォルトサーバーのセキュリティの強化
Linuxユーザーは、手動で構成することにより、Nginxサーバーの全体的なセキュリティを簡単に強化できます。前述のように、最適な保護を実現するには、Nginxを実行するすべてのマシンでSELinuxをオンにする必要があります。 / nginxで正しい権限を設定する また、非常に重要です。 Nginxドキュメントに対してユーザーが持っている権限を見つけるには、以下のコマンドを実行します。
$ sudo find /nginx -user nginx $ sudo find /usr/local/nginx/html -user nginx
これらのドキュメントのルートまたは所有者のみがそれらに書き込みアクセスできることを確認してください。攻撃者はマシンへのさらなる特権を取得するためにより多くの時間と専門知識を必要とするため、将来の侵入の場合に命を救うことができます。以下のコマンドを使用して、viまたは他のLinuxテキストエディタによって作成された不要なアーカイブを削除します。
$ sudo find /nginx -name '.?*' -not -name .ht* -or -name '*~' -or -name '*.bak*' -or -name '*.old*' $ sudo find /usr/local/nginx/html/ -name '.?*' -not -name .ht* -or -name '*~' -or -name '*.bak*' -or -name '*.old*'
18。 Nginxログの監査
Nginxサーバーのログファイルを確認すると、ユーザーの関心や不要な認証の試行などの貴重な情報が得られます。サーバーログを適切に監視する機能は、この理由からWebマスターにとって有用な資産です。
サーバーのログファイルは、 / usr / local / nginx / logsにあります。 ディレクトリ。以下のコマンドは、機密情報をgrepする方法を示しています。
$ sudo grep "/login.php??" /usr/local/nginx/logs/access_log $ sudo grep "...etc/passwd" /usr/local/nginx/logs/access_log $ sudo egrep -i "denied|error|warn" /usr/local/nginx/logs/error_log
Nginxログをリアルタイムでチェックし、サーバーで何が起こっているかを常に把握できる特定の監査アプリケーションをインストールまたは構築することもできます。
19。コンテナでのNginxの実行
ほとんどの専門家は、専用のコンテナ内からNginxサーバーを実行するようにユーザーにアドバイスしています。コンテナは、プロセスを相互に分離するように構築されたサーバーマシン上の分離された環境です。 Nginxサーバーは、LXD、Docker、FreeBSD jail、XEN、その他のLinux仮想エミュレーターなどのコンテナーに簡単にインストールして実行できます。これらは、ウェブマスターの間ではまとめてchroot刑務所として知られています。
サーバー専用のコンテナーには、サーバーの実行とクライアント要求の処理に必要なすべてのリソースが含まれます。あなたが得る利点は、あなたのマシンの他の部分からこのサーバーを分離することです。そのため、誰かが抜け穴からサーバーに不正アクセスしたとしても、システムコアを制御することはできません。
20。役立つ提案
一元化された構成ファイルを変更することで、NginxWebサーバーのさまざまな側面を簡単に構成できます。やるべきことはたくさんあります。たとえば、クリックジャッキングを回避するには、次を使用します。
add_header X-Frame-Options SAMEORIGIN;
次の行では、一部のブラウザによるコンテンツタイプのスニッフィングが無効になります。
add_header X-Content-Type-Options nosniff;
クロスサイトスクリプティング(XSS)フィルターを有効にするには、
を使用できます。add_header X-XSS-Protection "1; mode=block";
Nginxのドキュメントから見つけることができるそのような便利な機能はたくさんあります。ただし、何かを適用する前に、それらが何をするかを理解していることを確認してください。そうしないと、設定の誤りが原因でサイトがダウンタイムに直面する可能性があります。
終わりの考え
NginxWebサーバーの人気にはあまりにも多くの理由があります。豊富な機能セットと一見無制限の構成機能により、最高のサーバーソフトウェアになりました。多くの管理者は、Nginxのデフォルトサーバーをインストールして使用しているだけです。このようにNginxが提供する多くの機能と柔軟性が欠けています。そのため、編集者はこの自由を利用して、これらのベストプラクティスの概要を説明しました。うまくいけば、私たちはあなたの興味を満たし、何か新しいことを学ぶのを手伝うことができました。