
しれっとオープンしてから数日。引き続きずっと触ってます。成長させる。
このサイトでは、今もいくつかのツールを提供してて、さらに今後も、サイト運営の現場で役に立つツールを、どんどん用意したい。
安心して使ってもらうためにも、このサイトを長く利用してもらうためにも、セキュリティ対策が必要だ。こんな小さなサイト、誰が狙うか、とも思うけども、最低限はしておかなくてはね。あ、どこかのハッカーさん、狙ってやろうなんて思わないでね、お金も得るものもは何もないから。
で、こうやってその事も書き留めておけば、誰かの目に留まり役に立つかもしれない・・・
安心して使ってもらうためにも、このサイトを長く利用してもらうためにも、セキュリティ対策が必要だ。こんな小さなサイト、誰が狙うか、とも思うけども、最低限はしておかなくてはね。あ、どこかのハッカーさん、狙ってやろうなんて思わないでね、お金も得るものもは何もないから。
で、こうやってその事も書き留めておけば、誰かの目に留まり役に立つかもしれない・・・
"うちには関係ないよ" は 関係ない
「この規模のサイトが、狙われるわけないでしょ」・・・実は、ネットの攻撃は無差別に“自動”で仕掛けられるものが大半。たとえば放置しているWordPressの管理画面に、世界中からブルートフォース(総当たり)アタックが日常的に来るのは、実際によくある話。だから「最低限」だけでも、しておかないとだめなんだよね。サーバ委に対する、権限とかが影響して、できることにはもちろん限りもあるけどね。
セキュリティ対策の考え方
専門的な技術的な説明ではなく、なるべくわかりやすく記録しておく。
インターネットにおけるセキュリティ対策は、どこの時点で、何から守るかを明確に定義して、それに粛々と対応してゆくことが大事だと思っている。
何層かにわけた図とかよくあるけど、要に次の3つに分けられると思う。
インターネットにおけるセキュリティ対策は、どこの時点で、何から守るかを明確に定義して、それに粛々と対応してゆくことが大事だと思っている。
何層かにわけた図とかよくあるけど、要に次の3つに分けられると思う。
- 一番外側 フロントと呼ばれるブラウザで直接アクセスするところ
- アクセスしたあと、プログラムなどの仕組みが動いているところ
- 大元のアクセスする基本部分
-
フロント(入口)
└ サイトを見に来た“誰でも触れる部分”
→ ログイン画面、フォームなど -
仕組み(中身)
└ サイトを動かしているプログラム部分
→ CMS(WordPress等)、各種プラグイン、APIなど -
土台(基盤)
└ サーバやOS、データベース、ネットワーク設定
フロント(入口)
.htaccess というサイトにおいて色々な設定ができるファイル。最近は、rootという権限を持っていないサーバーでも、レンタルサーバーでも設定できるようになってきているね。
# ========================================
# リスト表示させない
# ========================================
Options -Indexes
# ========================================
# ファイル保護
# ========================================
<Files ".htaccess">
Order Deny,Allow
Deny from all
</Files>
<Files ".htpasswd">
Order Deny,Allow
Deny from all
</Files>
# ========================================
# アップロードファイル保護
# ========================================
# ログ・設定ファイル保護
<Files "*.log">
Order Deny,Allow
Deny from all
</Files>
<Files "*.ini">
Order Deny,Allow
Deny from all
</Files>
<Files "*.conf">
Order Deny,Allow
Deny from all
</Files>
# バックアップファイル保護
<Files "*.bak">
Order Deny,Allow
Deny from all
</Files>
<Files "*.backup">
Order Deny,Allow
Deny from all
</Files>
<Files "*.old">
Order Deny,Allow
Deny from all
</Files>
<Files "*.tmp">
Order Deny,Allow
Deny from all
</Files>
# ========================================
# 著名な攻撃への基礎対策
# ========================================
# SQLインジェクション対策
RewriteCond %{QUERY_STRING} (union|select|insert|delete|update|drop|create|alter|exec|script) [NC]
RewriteRule ^(.*)$ - [F,L]
# XSS対策
RewriteCond %{QUERY_STRING} (<script|<iframe|<object|<embed|javascript:|vbscript:|onload|onerror) [NC]
RewriteRule ^(.*)$ - [F,L]
# パストラバーサル対策
RewriteCond %{REQUEST_URI} (\.\.\/|\.\.\\|%2e%2e%2f|%2e%2e\\) [NC]
RewriteRule ^(.*)$ - [F,L]
# 不正なユーザーエージェント対策
RewriteCond %{HTTP_USER_AGENT} ^$ [OR]
RewriteCond %{HTTP_USER_AGENT} (sqlmap|nmap|nikto|w3af|acunetix|nessus|openvas) [NC]
RewriteRule ^(.*)$ - [F,L]
# ========================================
# セキュリティヘッダー強化
# ========================================
<IfModule mod_headers.c>
# XSS Protection
Header always set X-XSS-Protection "1; mode=block"
# Content Type Options
Header always set X-Content-Type-Options "nosniff"
# Frame Options
Header always set X-Frame-Options "SAMEORIGIN"
# Referrer Policy
Header always set Referrer-Policy "strict-origin-when-cross-origin"
# サーバー情報隠蔽
Header unset Server
Header unset X-Powered-By
</IfModule>
少し説明、付けておきますね。
リスト表示させない
ディレクトリの中身が丸見えだと、地味に危ない。見えなくしておくのが吉。
Options -Indexes
ファイル保護
設定とかログとか、大事なファイルは外から見えないようにガード。
<Files ~ "\.(env|git|htpasswd|htaccess|ini|log|sh|bak)$">
Order Deny,Allow
Deny from all
</Files>
アップロードファイル保護
もしもユーザーに変なファイルを上げられても、実行させなければとりあえずセーフ。
<FilesMatch "\.(php|cgi|pl|py|exe|sh)$">
Order Deny,Allow
Deny from all
</FilesMatch>
バックアップファイル保護
消し忘れたバックアップ、意外と多い。ここも一応ブロック。
<FilesMatch "\.(bak|old|save|orig)$">
Order Deny,Allow
Deny from all
</FilesMatch>
SQLインジェクション対策
URLに怪しいSQLキーワードが入ってたら強制シャットアウト。ざっくりだけど結構効く。
RewriteCond %{QUERY_STRING} (union|select|insert|delete|update|drop|create|alter|exec|script) [NC]
RewriteRule ^(.*)$ - [F,L]
XSS対策などHTTPヘッダー追加
サーバーやブラウザに一声かけておくだけで守れる部分は結構ある。
Header always set X-XSS-Protection "1; mode=block"
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header unset Server
Header unset X-Powered-By
ほんと、シンプルな基本だけど、ひとまず・・・
Google reCaptcha
フォームにはこれだね。いまは Version3(V3)。私はロボットじゃない とか バイクのある写真選べ とかなくなって使いやすくなった。閾値をセットして、アクセスがロボットかどうかを判断してくれる。完全、100%とは言えないだろうけど、最低限、ね。ありがとうございます。
こちらで まずはキーを取得。サイトキー と シークレットキー
送信フォームにこれを追加しておく
1. API KEy の取得
https://developers.google.com/recaptcha?hl=jaこちらで まずはキーを取得。サイトキー と シークレットキー
2.フロント側
{サイトkey) には取得したサイトキーをセット。
<script src="https://www.google.com/recaptcha/api.js?render={サイトkey)"></script>
<script>
grecaptcha.ready(function() {
grecaptcha.execute('{サイトkey)', {action: 'submit'}).then(function(token) {
var recaptchaResponse = document.getElementById('recaptchaResponse');
recaptchaResponse.value = token;
});
});
</script>
送信フォームにこれを追加しておく
recaptcha の値を格納するところ。
<input type="hidden" name="recaptcha_response" id="recaptchaResponse">
3.サーバー側
これは phpサイトでの一例。 $_val は送られてくる Recaptcha の値。$_sid はシークレットキー、ね。
public function ckRecaptcha($_val,$_sid) {
$_rt = null;
if(
(!empty($_val))
){
$recaptcha_secret = $_sid;
$recaptch_url = 'https://www.google.com/recaptcha/api/siteverify';
$recaptcha_params = [
'secret' => $recaptcha_secret,
'response' => $_val,
];
$recaptcha = json_decode(file_get_contents($recaptch_url . '?' . http_build_query($recaptcha_params)));
if(!(
(!empty($recaptcha))
&&(!empty($recaptcha->score))
)){
$_rt = false;
}else{
if ($recaptcha->score >= 0.6) {
$_rt = true;
} else {
$_rt = false;
}
}
}
return $_rt;
}
こういう関数を用意してチェック。でも実際は、サーバーの様々な理由から簡単に導入できず数日悩むこともあるんだよね・・・まぁ、それに泥臭く対応するのが仕事なんだけど。
今日はここまで。本当はもっと フロント側やったことあるので、また、ここに追記しておきます。
後日、
- 仕組み(中身)
- 土台(基盤)
でやったことも公開しておきます。お役に立てれば・・・