はじめに
今までの通信はCLのブラウザーからWebサーバへ認証無しでアクセスできた。
しかしこれだと悪意あるユーザがWebサーバにアクセスできてしまう。
今回は【ベーシック認証】という、Webサイトに対して必要最低限の認証設定をかける。
http(Apache)の機能が持つ認証システムで、手軽に制限をかける認証方法です。
Basic認証 特徴
Basic認証はページやファイルなど、特定の領域に制限をかけられる点。
Basic認証で制限されたページは認証ダイアログが起動し、ユーザーIDとパスワードの入力を求めます。
正しい値が入力されると認証され、ユーザーは閲覧が可能となる。
下図のBasic認証が可能になるようWebサーバ側で設定し、CL側で動作確認する。
誰にもprivateディレクトリにアクセスはさせません。
然るべきIDとPWを知っている人のみアクセスできるようにBasic認証設定をする。
Basic認証には設定方法が次の2通りある。
-
httpd.conf
に認証設定を追記 - 外部設定ファイル
.htaccess
の利用
※設定方法が違うが記述方法はほぼ同じ
両方のやり方で動作確認するが、まず前者から。
httpd.conf
に対するbasic認証設定
①Webサーバ側でuser1&2&3がないのでアカウント追加作成する。
[root@sv ~]# grep "^user" /etc/passwd
[root@sv ~]# useradd user1
[root@sv ~]# passwd user1
(割愛)
アカウント・グループ・パスワード作成されたか念のため確認
[root@sv ~]# tail -n 3 /etc/{passwd,group,shadow}
==> /etc/passwd <==
user1:x:1001:1001::/home/user1:/bin/bash
user2:x:1002:1002::/home/user2:/bin/bash
user3:x:1003:1003::/home/user3:/bin/bash
==> /etc/group <==
user1:x:1001:
user2:x:1002:
user3:x:1003:
==> /etc/shadow <==
user1:$6$qsd9tP4qlK6daU.O$uSNnH.7mIX7h3dzpGKa43CpGHdWZ4n9R9iJm.8FD5mjiKclb.o9JjMoEYPnPby6n9gvHHpiiRt4iagp2im20R.:19337:0:99999:7:::
user2:$6$ZJUPSwAfGV1wN1L9$IDTEK9QSXRa/uGZQGdKrqz6qCSiHaR.h9XCr7Hjg4prxVFEH5t51rkKB1w3jpUcFd42Vq4/VnIMg9tW5xASXD/:19337:0:99999:7:::
user3:$6$qeI0mqbw7BGRLvdX$fuWsGGF2BsxnHEVy4Ot26CmP6d8Tc3GjFsho6.Fe8Yrr5SmE9q0CHNCk/hNdBX/Go5Nf1zVop8y0IscHBX3Fd.:19337:0:99999:7:::
②公開dir・コンテンツの作成
/var/www/html
配下に新にprivate
ディレクトリを作り(公開dir)、
その配下にコンテンツtest.htmlを作成する。
[root@sv ~]# cd /var/www/html/ ; pwd
/var/www/html
[root@sv html]# mkdir private
[root@sv html]# vim private/test.html
③Basic認証の設定(①設定ファイルの利用)
初めに設定ファイルに直接定義するやり方。
apacheの設定ファイルhttpd.conf
の最終行に以下を追記。
361 ########## Basic Authetication ##########
362 <Directory "/var/www/html/private"> ←basic認証対象の公開dir
363 AuthType Basic ←認証タイプ:今回はbasic認証を指定
364 AuthName "Please enter your ID and PW" ←同公開dirにアクセスした時に表示するメッセージ
365 AuthUserFile /etc/httpd/conf/.htpasswd ←basic認証対象ユーザを'.htpasswd'ファイルに登録する
366 require valid-user ← /etc/passwdに登録されてるユーザが対象
367 </Directory>
368 ##############################################
今回はbasic認証でアクセス制御するが、その他に
- Digest(ダイジェスト)認証
- Form(フォーム)認証
などがある。
詳しくは以下リンク参照
Basic認証とは?その仕組みとすり抜けできるなど脆弱性についても解説
編集したら保存して構文チェック
[root@sv html]# apachectl configtest
Syntax OK
[root@sv html]# systemctl restart httpd ; systemctl status httpd
● httpd.service - The Apache HTTP Server
Active: active (running)
③認証時に使用する(ID,PWD)の設定 '.htpasswd'
このファイルはvimで編集できず、次の専用のコマンドhtpasswd
でBasic
認証対象のユーザ(つまりアクセスを許すuser)の登録をする。
htpasswdコマンドのマニュアルをmanコマンドで確認するとそれらしき事記述されてますね
HTPASSWD(1) htpasswd HTPASSWD(1)
NAME
htpasswd - Manage user files for basic authentication
SUMMARY
htpasswd is used to create and update the flat-files used to store usernames and password for basic authentication of HTTP users.
If htpasswd cannot access a file, such as not being able to write to the output file or not being able to read the file in order
to update it, it returns an error status and makes no changes.
デフォルトでは、/etc/httpd/conf/.htpasswd
ファイルはないので新規作成する。
[root@sv html]# ls -l /etc/httpd/conf/.htpasswd
ls: '/etc/httpd/conf/.htpasswd' にアクセスできません: そのようなファイルやディレクトリはありません
[root@sv html]# htpasswd -c /etc/httpd/conf/.htpasswd user1
New password:
Re-type new password:
Adding password for user user1
[root@sv html]# ls -l /etc/httpd/conf/.htpasswd
-rw-r--r--. 1 root root 44 12月 12 01:58 /etc/httpd/conf/.htpasswd
-c : 新規作成(create)
pwは'basicuser1'にした(任意)
user2も同様に登録する
[root@sv html]# htpasswd /etc/httpd/conf/.htpasswd user2
New password:
Re-type new password:
Adding password for user user2
追加でユーザ登録する場合は、-cオプションつけない。
つけると上書きされてしまうので注意!
新規作成した2つのユーザの確認
[root@sv html]# cat /etc/httpd/conf/.htpasswd
user1:$apr1$sch8AOCc$EX/GhxyrrUm6L3e2A9lme/
user2:$apr1$26ZMc/xM$4QNo/iK53dreeYcXTktR1/
以上、Webサーバ側でのBasic認証の設定終わり。
これで/var/www/html/private
配下にアクセスできるユーザは、user1とuser2のみのはず。
動作確認に移る。
CLからアクセス
ブラウザーでhttps://www.d000.mgt.local/privateへアクセス
ユーザ名とパスワードを求められる。
/etc/httpd/conf/.htpasswd
ファイルで定義したユーザー以外はログインできないことを確認
user1&user2:認証成功
user3:認証失敗
401のエラーが返ってくる。
※上記の動作確認には都度キャッシュクリア必須。
⑥user2にBasic認証の抹消をする
前述からわかるように、現在user1とuser2がbasic認証の対象になっていて、公開dirにアクセス
できることを確認した。ここでuser2をその対象から外し、アクセス拒否にする。
Webサーバ側で次のコマンドを叩く
[root@sv html]# cat /etc/httpd/conf/.htpasswd
user1:$apr1$sch8AOCc$EX/GhxyrrUm6L3e2A9lme/
user2:$apr1$26ZMc/xM$4QNo/iK53dreeYcXTktR1/
[root@sv html]# htpasswd -D /etc/httpd/conf/.htpasswd user2
Deleting password for user user2
[root@sv html]# cat /etc/httpd/conf/.htpasswd
user1:$apr1$sch8AOCc$EX/GhxyrrUm6L3e2A9lme/
user2が.htpasswdファイルから抹消されたことを確認。
CLで動作確認
user1では問題なくログインできた。
httpd.conf
に認証設定を追記する方法でのBasic認証は以上。
次に、外部設定ファイル.htaccess
の利用してのBasic認証に進む
外部設定ファイル.htaccess
の利用してのBasic認証
別のファイルに認証情報を登録しておいて、それをメインのファイルで読む込むというやり方。
①公開ディレクトリの配下に.htaccess
ファイルを作成する。
[root@sv html]# vim private/.htaccess
1 AuthType Basic
2 AuthName "Please type your ID and PW (Basic):"
3 AuthUserFile /etc/httpd/conf/.htpasswd
4 Require valid-user
記載内容自体は先ほど設定ファイルの文末に書いた内容を同じですね。
ただ外部ファイルに今回が記載しただけの違いです。
②メインの設定ファイル/etc/httpd/conf/httpd.conf への追記
前述の方法の最終行に追記した設定を#でコメントアウト
361 ########## Basic Authetication ##########
362 ###<Directory "/var/www/html/private">
363 ###AuthType Basic
364 ###AuthName "Please enter your ID and PW"
365 ###AuthUserFile /etc/httpd/conf/.htpasswd
366 ###require valid-user
367 ###</Directory>
368 ########## Basic Authetication ##########
369
370 <Directory "/var/www/html/private">
371 AllowOverride AuthConfig ←外部ファイル.htaccessファイルの内容を読み込みますよって意味
372 </Directory>
保存して構文チェックし、デーモン再起動
[root@sv html]# apachectl configtest
Syntax OK
[root@sv html]# systemctl restart httpd
[root@sv html]# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running)
CL側で動作確認
割愛
以上、Basic認証を使ってのアクセス制御でした
実務ではどちらでBasic認証設定するんでしょうね。
今の所、メインの設定ファイルに余計な情報記述して無駄に長くしたくないので
私なら2番目に説明した外部設定ファイル.htaccessの利用した設定をするかなと思います。