何がしたいのか
本シリーズでは PHP で Web サイトをあえてシンプルに、脆弱に構築していき、Web セキュリティについて学んで行けたらと思います。
というのも、初心者が最初から安全な Web サイトを意識して作り始めると「エスケープ処理が適切か」だとか「セッションIDの推測が~」とかなんとか言われて結局どこかで手が止まります。
だって人に「これ危険だから!」とか言われても「へー」としか思わないですよね。これじゃあ続かないです。どこかで「へーーー…」と失速していきます。
結論として、冒頭にあるように本シリーズでは最初から脆弱性を作り込まない開発はやりません。逆に最も脆弱なサイトを作り、そこから脆弱性の対処を行うという流れで進めていきます。
なお、HTML と CSS の解説や途中に出てくるツール(Burp)などの説明はほとんど省略するのであしからず。
構成
サーバは CentOS8 のマシンを2台用意し、1台目に Apache を、2台目に MySQL を導入します。なお SELINUX と Firewalld は無効化しておき、IP はそれぞれ 192.168.0.200、210 とします。
Xampp でもいいんですが、実際の環境に近い方が勉強になると思うので形だけは Web サーバと DB サーバを分けます。実際には OS の設定はほぼ手付かずです。
Apache と MySQL の導入方法
MySQL の構築方法については次回説明します。Apache は yum でインストールするだけですが、よくわからない方は以下の記事を参考にしてください。
vsftpd
Web サーバには vsftpd をインストールしておき ftp で繋げられるようにしておきます。
TeraTerm の SCP でコピーでもいいんですが、コンテンツが増えると絶対面倒になるので最初から FTP の環境を作っておきます。
以下のコマンドを実行してください。
yum install -y vsftpd
systemctl start vsftpd
systemctl enable vsftpd
そのあとに「/etc/vsftpd/vsftpd.conf」に「userlist_enable=YES」があることを確認します。デフォルトは YES です。
次に「/etc/vsftpd/user_list」を以下のように修正します。ここに記載されているユーザは接続が拒否されます。
# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
# root
…
次に「/etc/vsftpd/ftpusers」を以下のように修正します。ここに記載されているユーザも接続が拒否されます。
# Users that are not allowed to login via ftp
# root
…
この時点で root で ftp が可能になります。
最シンプルを知る
下準備ができたので、ここで以下のような最シンプルかつ使い物にならない index.html を作成して Apache で公開しました。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Yamazon</title>
<link rel="shortcut icon" href="image/favicon.ico">
<link rel="stylesheet" href="css/reset.css">
<link rel="stylesheet" href="css/style.css">
</head>
<body>
a
</body>
</html>
表示内容はただの a ですが、れっきとした Web ページです。
最後に Burp を使用して最もシンプルな HTTP メッセージを見てみます。
favicon.ico、style.css を見配置(reset.cssは配置済)の場合、以下のように favicon.ico と style.css が404で帰ってきます。
上記から HTTP はそれぞれのコンテンツに対して1つ1つ GET を行っていることが分かります。
また、GET の確認において注意しなくてはならないのがキャッシュです。例えば Ctrl+F5 ではなく通常の F5 もしくはブラウザの更新ボタンにより更新を行った場合、index.html が200ではなく304(Not Modified)となります。
次回は DB サーバを構築していきます。