最低限知っておきたい webセキュリティーについて@mt関西
Post on 20-Jul-2015
257 Views
Preview:
TRANSCRIPT
第2回 MT KANSAI
最低限知っておきたい Webセキュリティーについて
KDDIウェブコミュニケーションズ 阿部 正幸
● ACE01 / SmartRelease プロダクトマネージャー ● CPI エバンジェリスト 統括 ● KDDIウェブ 公認 CPI スタッフブログ 編集長 ● Drupal(g.d.o Japan)日本コミュニティー ● テックアカデミー 講師 ● HTML5 Fun 理事 OSSを広げる活動、Web制作に関する情報発信を行う
神戸生まれ、横浜育ち、7月31日生まれ 阿部 正幸(あべ まさゆき)
ディレクター プログラマー プロマネ Evangelist
Venture Since 1998
Web Service Hosting
cpi-line
Line@ 始めました
Line限定の情報も発信しています。
本日は『 Webセキュリティー 』 できていて当たり前のことを紹介します。
できていないと
『 恥ずかしい 』と思ってください。
第1章
WWWに公開することの危険性
WWW公開直後から狙われています
WWW公開直後から狙われています
セキュリティーリスク
2013年8月、某レンタルサーバー会社に対する Wordpressの脆弱性を狙ったサイト改ざん被害件数
8,438件
セキュリティーリスク
- 一部上場企業のサイトダウン -
第2章 - 侵入経路を防ぐ -
私たちが最低限できること
究極のセキュリティー対策
個人情報など含むデータを
保持しないこと
セキュリティーリスク軽減のために
万が一の時は リストア
アップデート、XSS対策など
侵入経路
CPU負荷監視等
監視 バックアップ
何かあってからでは手遅れ、
事前準備を行うことが大事
第2章 - ID、パスワードについて -
私たちが最低限できること
なにげなく付けているID、パスワード
危険です!!
『 参考資料 』
弊社メールサーバーのアタック状況
- 2015年 5月 7日ログより -
アタック元 1位は
『 中国 』
ブルートフォースアタック で狙われるアカウントは
『 test 』
アカウント名 計
1 test@ 271,948
2 info@ 192,031
3 admin@ 173,350
4 demo@ 54,967
5 anonymous@ 47,298
6 root@ 46,930
7 company@ 46,213
8 webmaster@ 46,208
9 postmaster@ 43,455
【ID】 admin、test、root、demo 【PW】 password、1234、1111
絶対にダメ!!!
『admin』に対してアタックきていました
- CPIスタッフブログ -
5月7日に資料を作成、5月7日の 朝方にアタックが来ていました (; ゚д゚)コワヒ
アプリケーションとして
第2章 - アップデートについて -
私たちが最低限できること
CMSアップデート
CMSのアップデートほぼ毎月?
『 必ず実施しましょう 』
アップデートしやすい CMS を構築
CMS Plugin Theme + +
CMSコアファイルには手をつけない
My plugin
CMS Plugin Theme + +
My Theme +
Web Site
OVERRIDE
My plugin
CMS Plugin Theme + +
My Theme +
Web Site
アップデート が容易
第2章 - XSSについて -
私たちが最低限できること
XSSについて
Webサイト管理者が意図しないJavascriptコードが サイト利用者に実行されること
Web site
悪意のあるユーザー
脆弱性のあるサイトを発見 <script>・・・</script> を設置
コメント・掲示板や、SNSなど
Web site 一般ユーザー
何も知らずにアクセス 悪意あるコードを実行される。
フィッシングサイトに飛ばされたり、 パスワードを盗聴されたり。
XSS例 <form> <button onclick="javascript:alert('Javascript実行がされました')"> Text </button> </form>
XSS例 <form> <button onclick="javascript:alert('Javascript実行がされました')"> Text </button> </form> ユーザーの何らかの操作が必要
HTML5 普及後
<video> <source onerror="javascript:alert('On-error')"> </video> <input value="" autofocus onfocus="alert('Auto-Focus')">
HTML5 普及後
<video> <source onerror="javascript:alert('On-error')"> </video> <input value="" autofocus onfocus="alert('Auto-Focus')">
onから始まらないイベントや、 Viedoタグ、Sourceタグなどから
実行可能に。
サイトが表示されただけで実行される
その他にも
• XMLHttpRequest • Cross Document Messaging • Office Web Application • Web Storage • WebSocket • Web Workers
XSS脆弱性に対して
ユーザーからの下記のような入出力があった 場合に無効化すれば良い
<video><source onerror="javascript:alert('On-error')"></video>
<input value="" autofocus onfocus="alert('Auto-Focus')">
<script>alert('Code')</script>
<script> function XSS(){
var some_text = '<input value="" autofocus onfocus="alert()">'
// 脆弱性のあるタイプ var f = document.getElementById("dtext"); f.innerHTML = some_text;
// javascriptをエスケープ var f = document.getElementById("dtext"); var safe_text = document.createTextNode(some_text); f.appendChild(safe_text);
} </script>
<a id="dtext" onclick="XSS('')">DOMを使った脆弱性テスト</a>
フロントエンドで無効化
<?php // < は「<」に // > は「>」に // & は「&」に // ” は「"e;」に、 // ’ は「'」に // 変換し悪意のあるスクリプトを無効化します。 $str = htmlspecialchars($some_text, ENT_QUOTES, 'UTF-8'); ?>
サーバーサイドで無効化
確認してみよう
<script>alert(‘hoge’)</script>
第2章 - SQLインジェクションについて -
私たちが最低限できること
Web site
悪意のあるユーザー
脆弱性のあるサイトを発見 SQL文を含めたクエリを送信 情報を抜きだしたり、Databaseを 削除したりすることができる。
SQLインジェクション対策が必要なケース
『動的にSQL文を生成する場合』
● ユーザーが入力したデータを元にSQL文を生成 - ログインフォーム、検索フォーム、掲示板等
● 読み込んだデータを元にSQL文を生成
- cookie、Database、RSSなどから
SQLインジェクション対策
フレームワークが用意しているO/Rマッパーを使う
● CMSやフレームワーク利用の場合
● PHPなどから接続する場合 文字コード指定
特殊文字をエスケープする
パラメータは変数に対してバインドする
PHPなどから接続する場合
『mysqli』 か、『PDO_Mysql』を使い
MySQLに接続しましょう。
Googleで「php mysql」などと検索するとmysql関数を 使ったコードの紹介が結構でてきますが、「mysql」関数は 非推奨です。
文字エスケープ
' → '' \ → \\
● SQLで使える特殊文字をエスケープ
攻撃例 ) SELECT * FROM user WHERE uid=’username' AND pwd='' OR 'A'='A'
シングルクオーテーションを使わない攻撃
SELECT name FROM user where uid = '$uid' AND age > $age
uid : user_id age : 31 AND SQL文
意図しないSQL文が実行されてしまう
シングルクオーテーションを使わない攻撃
SELECT name FROM user where uid = '$uid' AND age > $age
uid : user_id age : 31 AND SQL文
意図しないSQL文が実行されてしまう
『mysqli::prepare() 』で
SQLで使うパラマメータをバインドする
$mysqli = new mysqli($host, $user , $pw , ”db"); /* プリペアドステートメントを作成します */ if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) { $stmt->bind_param("s", $city); /* パラメータをバインド */ $stmt->execute(); /* クエリを実行します */ $stmt->bind_result($district); /* 結果変数をバインド */ $stmt->fetch(); /* 値を取得します */ $stmt->close(); /* ステートメントを閉じる */ } /* 接続を閉じる */ $mysqli->close();
$mysqli = new mysqli($host, $user , $pw , ”db"); /* プリペアドステートメントを作成します */ if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) { $stmt->bind_param("s", $city); /* パラメータをバインド */ $stmt->execute(); /* クエリを実行します */ $stmt->bind_result($district); /* 結果変数をバインド */ $stmt->fetch(); /* 値を取得します */ $stmt->close(); /* ステートメントを閉じる */ } /* 接続を閉じる */ $mysqli->close();
『 バインドする場所』
$mysqli = new mysqli($host, $user , $pw , ”db"); /* プリペアドステートメントを作成します */ if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) { $stmt->bind_param("s", $city); /* パラメータをバインド */ $stmt->execute(); /* クエリを実行します */ $stmt->bind_result($district); /* 結果変数をバインド */ $stmt->fetch(); /* 値を取得します */ $stmt->close(); /* ステートメントを閉じる */ } /* 接続を閉じる */ $mysqli->close();
『パラメータの型を指定』 i:Integerを指定 d:doubleを指定 s:stringを指定 b:blobを指定
第2章 - 監視 -
私たちが最低限できること
サーバー監視 外形監視
リソース監視
通常使われている80番portなどを監視し、 サービスが稼働しているか確認する。(ping、telnet)
Disk、CPU、Memoryなどのロードアベレージを監視 閾値を超えると、運用チームが調査にはいる。
第2章 - バックアップ -
私たちが最低限できること
バックアップ
万が一に備えてバックアップ取得も重要
e.g ) ACE01
Webサーバー Raid構成
Systemバックアップ
SmartRelease
外部バックアップ
標準
標準
オプション
Github、dropbox …
第3章 - クラウド型WAFサービス -
私たちが最低限できること
クラウド型WAFサービス
● WAF ( Web application firewall )
● CDN ( Content delivery network )
● Blocks network layer DDoS attacks
● Load balancing and failover
● WAF ( Web application firewall )
● CDN ( Content delivery network )
● Blocks network layer DDoS attacks
● Load balancing and failover
いい感じにブロックしてくるし、
いい感じにキャッシュしてくれる
Incapsula エンタープライズ版を導入し
CDNを試してみた。
まずはテキストファイルに対してアタック
928 requests / s 0 error & 0 timeout
計算してみると
928 hits / sec ×
86,400 ( 1 Day )
30 ( 1 Month )
× =
(2,405,376,000) 24 億PV / 月
CPIスタッフブログにアタック
175 requests / s 0 error & 0 timeout
175 hits / sec ×
86,400 ( 1 Day )
30 ( 1 Month )
× =
(453,600,000) 4億 PV / 月
計算してみると
まとめ
● セキュリティーのために
侵入経路を防ぐ、監視、バックアップ
● 多様化する攻撃手法のために
クラウド型のWAFを導入するのも◎
ご清聴ありがとうございました
ID:chiyo.abe 阿部 正幸
top related