Webサイトのセキュリティ対策

Index
― 目次 ―「セキュリティヘッダー/レスポンスヘッダーの設定」について
セキュリティヘッダーは、Webサーバーからブラウザに送信される追加情報のことで、Webサイトのセキュリティの設定を指示するために使用します。セキュリティヘッダーは、HTTPレスポンスの一部として送信され、ブラウザがWebサイトとどのように相互作用するかを制御しています。
HTTPセキュリティヘッダーは、ウェブサイトに対する様々な種類の攻撃を防ぐために設計されており、クロスサイトスクリプティング(XSS)攻撃、クリックジャッキング、中間者攻撃などから保護するために使用されますので、適切に設定されたHTTPセキュリティヘッダーは、Webサイトのセキュリティを向上させることに役立ちます。
※「.htaccess」での設定例を基に解説します。
HTTPセキュリティヘッダーは、ウェブサイトに対する様々な種類の攻撃を防ぐために設計されており、クロスサイトスクリプティング(XSS)攻撃、クリックジャッキング、中間者攻撃などから保護するために使用されますので、適切に設定されたHTTPセキュリティヘッダーは、Webサイトのセキュリティを向上させることに役立ちます。
セキュリティヘッダー「HTTP Strict Transport Security(HSTS)」の設定について
WebサイトがHTTPSを介してのみアクセス可能であることを指示するセキュリティヘッダーで、「HSTS」を有効にすることによって、HTTPからHTTPSへの自動リダイレクトを強制し、中間者攻撃のリスクを軽減することができます。※「.htaccess」での設定例を基に解説します。
1 2 |
# レスポンスヘッダーにHSTSを追加 Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" |
[補足]
2行目「max-age=31536000」が有効期間を1年に設定(※HSTSプリロードリストに登録する場合、31536000秒(1年)以上にする必要があります)、「includeSubDomains」がサブドメインも有効化(※HSTSプリロードリストに登録する場合、設定する必要があります)、「preload」がHSTSプリロードリストに登録(※HSTSプリロードリストに登録する場合、設定する必要があります)。
※以下のWebサイトより、HSTSプリロードリストに登録申請することができます。
https://hstspreload.org
2行目「max-age=31536000」が有効期間を1年に設定(※HSTSプリロードリストに登録する場合、31536000秒(1年)以上にする必要があります)、「includeSubDomains」がサブドメインも有効化(※HSTSプリロードリストに登録する場合、設定する必要があります)、「preload」がHSTSプリロードリストに登録(※HSTSプリロードリストに登録する場合、設定する必要があります)。
※以下のWebサイトより、HSTSプリロードリストに登録申請することができます。
https://hstspreload.org
セキュリティヘッダー「X-Frame-Options」の設定について
Webサイトのコンテンツを他サイトのフレーム内に表示することを制御するセキュリティヘッダーで、「X-Frame-Options」を適切に設定することによって、クリックジャッキング攻撃を防ぐことができます。※「.htaccess」での設定例を基に解説します。
1 2 3 4 5 |
# レスポンスヘッダーにX-Frame-Optionsを追加 Header always set X-Frame-Options "SAMEORIGIN" # レスポンスヘッダーにCSPを追加 Header always set Content-Security-Policy "frame-ancestors 'self';" |
[補足]
2行目「SAMEORIGIN」が同一オリジン内のみフレーム表示を許可(※自サイトは許可)。
その他に「DENY:フレーム表示を完全に拒否」と「ALLOW-FROM:指定したドメインからのフレーム表示を許可」があります。
1点注意が必要なのは「X-Frame-Options」は、現在非推奨となっていますので「Content Security Policy(CSP)」で設定することをお勧めします。
その記述が5行目「frame-ancestors ‘self’;」。「X-Frame-Options」の「SAMEORIGIN」と同じ意味になります。
2行目「SAMEORIGIN」が同一オリジン内のみフレーム表示を許可(※自サイトは許可)。
その他に「DENY:フレーム表示を完全に拒否」と「ALLOW-FROM:指定したドメインからのフレーム表示を許可」があります。
1点注意が必要なのは「X-Frame-Options」は、現在非推奨となっていますので「Content Security Policy(CSP)」で設定することをお勧めします。
その記述が5行目「frame-ancestors ‘self’;」。「X-Frame-Options」の「SAMEORIGIN」と同じ意味になります。
レスポンスヘッダー「X-Powered-By」の設定について
Webサーバーが送信するHTTPレスポンスヘッダーには、Webサイトを動かしているソフトウェアやフレームワークの情報が含まれています。例えば、PHPで動作している場合、そのバージョンがヘッダーに表示されます。そのバージョンで脆弱性が確認されている場合、攻撃されるリスクがありますので、悪意のある攻撃者やマルウェアから防御する上で、バージョンを非表示にすることは、セキュリティ面での効果が期待できます。
※「php.ini」での設定例を基に解説します。
1 2 |
; X-Powered-By設定:PHPバージョンをレスポンスヘッダに表示しない expose_php = Off |
[補足]
2行目「expose_php = Off」がPHPバージョンをレスポンスヘッダに表示しない。
2行目「expose_php = Off」がPHPバージョンをレスポンスヘッダに表示しない。
Google Chromeブラウザの開発者ツールで設定内容を確認
▼Google Chromeブラウザの開発者ツール
[補足]
①Google ChromeブラウザでF12キーを押す
Google Chromeブラウザの開発者ツールを立ち上げます。
②Networkタブを選択
ネットワーク関連の情報を確認することができます。
③ブラウザを更新(リロード)
ブラウザを更新(リロード)し、最新の情報を表示させます。
④ドメインを選択
ドメインを選択し、表示された画面からHeadersタブを選択します
⑤レスポンスヘッダーを確認
各レスポンスヘッダーの設定情報を確認することができます。
「FTPプロトコルで平文通信を行っている(暗号化された通信を行っていない)危険性とその対策」について
Webサーバーにファイル転送する際、多くの方がWinSCPやFileZillaなどのFTPクライアント専用ソフトを利用し、ファイルのアップロードやダウンロードをされているかと思います。
FTP接続は、暗号化通信をする仕様にはなっていないため、セキュリティリスクが高く危険な接続方法です。
また、ブルートフォースアタック、FTPバウンス攻撃、スプーフィング攻撃などの様々な脆弱性も報告されています。
そのため、SFTP(SSH File Transfer Protocol)やFTPS(File Transfer Protocol over SSL/TLS)などの暗号化された通信方法でWebサーバーに接続しましょう。
SFTP接続との違いでいうと、SFTP通信に必要なポート番号は1つで済みますが、FTPS接続では複数のポート番号を使用するといった違いがあげられます(※コマンドチャネル用の最初のポートは、認証とコマンドの受け渡しに使用されますが、ファイル転送の要求やディレクトリ一覧の要求が行われる度にデータチャネル用に別ポート番号を開く必要があります → FTPS接続を許可するためにファイアウォールで様々なポートを開く必要があり、ファイアウォールの使い勝手は良くはなく、セキュリティリスクになり得ることもあります)。
FTP接続は、暗号化通信をする仕様にはなっていないため、セキュリティリスクが高く危険な接続方法です。
また、ブルートフォースアタック、FTPバウンス攻撃、スプーフィング攻撃などの様々な脆弱性も報告されています。
そのため、SFTP(SSH File Transfer Protocol)やFTPS(File Transfer Protocol over SSL/TLS)などの暗号化された通信方法でWebサーバーに接続しましょう。
SFTP(SSH File Transfer Protocol)
セキュアシェル(SSH)上で暗号化されたデータ転送を行うプロトコルで、IDとパスワード認証だけではなく、よりセキュアな通信が可能なSSHキー認証があります。SSHの公開鍵と秘密鍵を生成しアカウントと関連付け、Webサーバーに公開鍵、FTPクライアントに秘密鍵をセットすることで、秘密鍵を保持している端末のみ接続することができます。また、パスワード認証を禁止することで、さらにセキュアな通信をすることも可能です。FTPS(File Transfer Protocol Secure)
FTP接続にセキュリティ機能を追加したもので、SSL/TLSという暗号化技術を導入し、データ転送の際の安全性を高めています。SFTP接続との違いでいうと、SFTP通信に必要なポート番号は1つで済みますが、FTPS接続では複数のポート番号を使用するといった違いがあげられます(※コマンドチャネル用の最初のポートは、認証とコマンドの受け渡しに使用されますが、ファイル転送の要求やディレクトリ一覧の要求が行われる度にデータチャネル用に別ポート番号を開く必要があります → FTPS接続を許可するためにファイアウォールで様々なポートを開く必要があり、ファイアウォールの使い勝手は良くはなく、セキュリティリスクになり得ることもあります)。
上記のような違いから、SFTP接続をお勧めします。
近年、ホスティングサービスでもSFTP接続が可能なWebサーバーは増えており、Webサーバー側の設定も比較的簡単に行うことが可能です。
近年、ホスティングサービスでもSFTP接続が可能なWebサーバーは増えており、Webサーバー側の設定も比較的簡単に行うことが可能です。
「既知の脆弱性が存在するソフトウェア(ライブラリ)の利用」について
WordPress本体とプラグインの利用について
WordPressを利用されている方は、本体やプラグインのアップデートに気を付けているかと思います。ですが「自動更新」の設定にしていると「いつのまにか表示がぐちゃぐちゃになっていた…」といったこともよくあります。
これは「PHPのバージョンが推奨バージョンよりも古い」「プラグインのバッティングが原因で不具合が発生している」など原因は様々です。WordPress本体は「メンテナンスリリースとセキュリティリリースのみの自動更新」設定がおすすめです。
▼「ダッシュボード」→「更新確認」より、以下をクリックする

WordPressには「メジャーアップデート」と「マイナーアップデート」があり、上記設定にしておくと「マイナーアップデートのみ自動更新」されます(※「メジャーアップデート」は、バックアップなども取った上で手動更新しましょう)。
[メジャーアップデートとマイナーアップデートの違い]
●メジャーアップデート:バージョンの1桁目や2桁目の数字が変わるアップデート
バージョン6.6 → 6.7のアップデートやバージョン5.9 → 6.0のアップデートなどがこちらにあたります。
※機能追加や仕様変更+セキュリティの強化や不具合の修正など
●マイナーアップデート:バージョンの3桁目の数字が変わるアップデート
バージョン6.6.1 → 6.6.2のアップデートなどがこちらにあたります。
※セキュリティの強化や不具合の修正など
プラグインは「自動更新を無効化」設定がおすすめです(※バックアップなども取った上で手動更新しましょう)。
▼「プラグイン」→「プラグイン一覧」より、一括操作で設定

jQuery(プラグイン)などの利用について
つい忘れがち(放置しがち)ですが、jQueryなどのプラグインは最新バージョンを保つようにしましょう。本記事投稿時点のjQuery最新バージョンは「3.7.1」です
「jQuery CDN(※jQuery CDNサイトにリンクします)」
※「minified」のリンクをクリックすると「縮小版のコード」が表示されますので、コピーして自サイトに貼り付けましょう
ソフトウェアやライブラリは、他にも多数ありますが、セキュリティ強化が施された最新バージョンを利用しましょう。
※ソフトウェアやライブラリをアップデートする前には、既存データのバックアップを取ってから実施してください
※アップデートを実施したことにより起こり得る不具合などについては、自己責任でのご対応をお願いいたします
今回は、「Webサイトのセキュリティ対策」についてご紹介しました。
制作時の参考になりましたら幸いです

例えば「セキュリティヘッダーを設定していない(もしくは不備がある)」「FTPプロトコルで平文通信を行っている(「SFPT=SSHベースによる暗号化されたセキュアな通信」や「FTPS=SSL/TLSによる暗号化されたセキュアな通信」を行っていない)」「既知の脆弱性が存在するソフトウェア(ライブラリ)を利用している」など、Webサイトは、日々セキュリティ対策を施していないことに起因する様々なリスクにさらされています。
今回は「今直ぐにできるセキュリティ対策」や「つい忘れがちなセキュリティ対策」についてご紹介します。