最初のメモ
seccamp2021のグループKのリレーブログの一貫です。
前回はこちら。次回はこちら。
与えられたテーマはデータベースのセキュリティです。
はい。データベースと言えばSQLがすっと思い浮かびますが特に触ってきてないので全く分かりません。やばい
誤植あれば教えて下さい。
DB導入編
データベースの定義
データベースとは、構造化した情報またはデータの組織的な集合であり、通常はコンピューター・システムに電子的に格納されています。データベースは通常、データベース管理システム(DBMS)で制御します。データとDBMS、およびそれらに関連するアプリケーションをまとめてデータベース・システムと呼びます。多くの場合は単にデータベースと呼んでいます。
引用元 : データベースとは | Oracle 日本
このデータベースを操作・構成するために用いられる言語の1つがSQLです。
次にデータベースの種類です。
1. 階層型
木構造のようなデータ構造を取る。ただし、子が親を複数持ちたい場合、重複登録をする。また、データの変更でルートを再登録する必要がある。
・検索が早い
・柔軟性、操作性に欠ける
2. ネットワーク型
グラフなので、階層型のような重複登録はない。
・重複登録を避けれる
・柔軟性に欠ける
3. リレーショナル
Excelのような表でデータを持つ。
・データの取扱が簡単
・処理速度の遅延(プログラムの複雑さが原因)
3-1. RDBMS
SQLを利用してリレーショナルデータベースを管理するシステムのことを指す。
・SQLによる操作なので、データの取扱が容易になる
・変更がすっとできない
3-2. NoSQL
SQLを利用しないでリレーショナルデータベースを管理する。
・RDBMSよりパフォーマンスがよい
・データの整合性、編集に難あり
RDBMSのセキュリティ
SQLインジェクションを防ぐというのがRDBMSのセキュリティとなります。
SQLインジェクションが発生する流れは次の通りです。
Webアプリでデータを取得するためのフォームがある。このフォームを通して、データにアクセスする。
入力された値はSELECTに入って、データベースと照合される。データが見つかればアクセスが許可され、見つからなかったら拒否される。
次に正常なデータへのアクセスとSQLインジェクションの2つについて示します。
DBは学籍番号と名前、学校のパスワードがあるとします。フォームにパスワードを打つことでマッチしたデータを出力してもらえます。
図1 データベースの中身
・通常の入力
inputにhoge_passが入るとデータベースのpasswordにマッチするので機会太郎のデータが見れます。
inputにhoge_piyoが入るとデータベースのpasswordにマッチしないので何も見れないです。
よくある' or 1=1 --を例に挙げます。
' : 前の'と対になっています。()みたいな感じ。文字列定数を終わらせる
or : ' 'か1=1が真の時、真となる
1=1 : いつでも真(多分真じゃないって言う人はいないよね)
-- : これ以降を無視する
なのでor 1=1だけでもSQLの構造によって書き方を変える必要がある。これを入力すると常に真なので全員の情報を見ることができます。
攻撃完了ですね。
SQLインジェクションを防ぐためには次のような対策が挙げられます。
1. エスケープする
エスケープとは特別な意味を持つ文字・記号を置換すること。例えば先程の=や'を全てASCIIの値に変換するとか、Unicodeにするとか。これで式自体は成り立たなくなる。
2. WAF
SQLインジェクションが成功してしまっても、不正なアクセス方法であれば、データを返さない。
ただ、現状としてSQLインジェクションの対策は後手になっているようです。
NoSQLのセキュリティ
SQLインジェクションはなくなったもののWebアプリケーション側に脆弱なプログラムがあり、インジェクションが発生することがある。ある程度理解して記事にまとめたかったが時間が足りないので今回は記事を貼ることで代用します。
他にも良い記事いっぱいあると思います。
最後に
難しい。IoTとデータベースのセキュリティの話もあったからあとでもう少し詳しく調べてみたいです。雑なまとめで申し訳ありません。