無料で構築するVPN(OpenVPN) Part.2
Part.1からの続きです。
TLS認証鍵をOpenVPN設定ファイル格納ディレクトリへ作成
# openvpn --genkey --secret /etc/openvpn/ta.key
OpenVPN設定ファイルをサンプルよりコピー
# cp -p /usr/share/doc/openvpn-2.2.2/sample-config-files/server.conf /etc/openvpn/
OpenVPN設定ファイル編集
# vi /etc/openvpn/server.conf --------------------------------------------------------- dev tun ←VPNインタフェースとしてTUNを指定(デフォルト) server 10.8.0.0 255.255.255.0 ←VPNクライアント割当てアドレス範囲として10.8.0.0/24を指定(デフォルト) ;push "route 192.168.10.0 255.255.255.0" ;push "route 192.168.20.0 255.255.255.0" push "route 192.168.253.0 255.255.255.0" ←追加(ルーティング) ;push "redirect-gateway def1 bypass-dhcp" push "redirect-gateway def1" ←追加(通信のGWをVPN経由にする) push "dhcp-option DNS 192.168.1.1" ←追加(DHCPにてIP配布時にDNS情報を付与) duplicate-cn ←コメント外す(同じ証明書で複数人接続可能とする) tls-auth ta.key 0 # This file is secret ←行頭の";"を削除してコメント解除(TLS認証有効化) user nobody ←行頭の";"を削除してコメント解除(OpenVPN実行権限を下げる) group nobody ←行頭の";"を削除してコメント解除(OpenVPN実行権限を下げる) status /var/log/openvpn-status.log ←追加(ログ) log /var/log/openvpn.log ←追加(ログ) management localhost 7505 ←最終行に追加(管理インターフェースの有効化) crl-verify crl.pem ←最終行へ追加(証明書廃止リストの有効化) ---------------------------------------------------------
証明書認証ではなく、ID/PW認証を行う場合は以下を追加
script-security 2 client-cert-not-required username-as-common-name auth-user-pass-verify /etc/openvpn/script/auth.php via-file
尚、ID/PW認証に利用するauth.phpは以下の内容となる。
今回はMySQLに格納したID/PWと認証を行う。
認証成功で"0″を返し、失敗であれば"1″を返す。
ちなみにクライアントが接続すると、平文で1行目にユーザ名、2行目にパスワードが流れる。
※駄作プログラムでよろしければお使いください。
#!/usr/bin/php
<?php
error_reporting(1);
define('DB_HOST','localhost');
define('DB_NAME','openvpn');
define('DB_USER','openvpn');
define('DB_PASS','********');
$conn = mysql_connect(DB_HOST,DB_USER,DB_PASS);
if($conn == FALSE){ print("DB CONNECT FAILED"); exit;}
mysql_selectdb(DB_NAME);
mysql_query('SET NAMES utf8;');
$fp = @fopen("$argv[1]","r");
$count = 0;
while(!feof($fp)){
$tmp[$count] = fgets($fp);
$count++;
}
fclose($tmp);
$username = rtrim($tmp[0]);
$username = mysql_real_escape_string($username);
$password = mysql_real_escape_string($tmp[1]);
$password = hash('sha256',$password);
// User Auth
$str = "
select * from user_tbl
where
username = '$username' and password = '$password' and active = '1'
";
$res = mysql_query($str);
$num = @mysql_num_rows($res);
if($num != 0){
echo "[OpenVPN] User: $username \n";
echo "[OpenVPN] Authentication ok. \n";
exit(0);
}else{
echo "[OpenVPN] User: $username \n";
echo "[OpenVPN] Authentication failed. \n";
exit(1);
}
?>
ついでにユーザ作成とかパスワード変更とかプログラム(user.php)を作ってみた。
#!/usr/bin/php
<?php
error_reporting(1);
define('DB_HOST','localhost');
define('DB_NAME','openvpn');
define('DB_USER','openvpn');
define('DB_PASS','********');
$conn = mysql_connect(DB_HOST,DB_USER,DB_PASS);
if($conn == FALSE){ print("DB CONNECT FAILED"); exit;}
mysql_selectdb(DB_NAME);
mysql_query('SET NAMES utf8;');
$mode = $argv[1];
if(!$mode){
echo basename(__FILE__).": {add|passwd|active|del|email|list} \n";
}
switch ($mode){
case "add":
$username = mysql_real_escape_string($argv[2]);
if(!$username){
echo("ユーザ名を入力してください \n");
}else{
$str = "
select * from user_tbl
where
username = '$username'
";
$res = mysql_query($str);
$num = @mysql_num_rows($res);
if($num == 0){
echo("パスワードを入力してください:");
$password1 = fgets(STDIN,1024);
echo("もう一度入力してください:");
$password2 = fgets(STDIN,1024);
if($password1 == $password2){
$password = mysql_real_escape_string($password1);
$password = hash('sha256',$password);
$str = "
insert into user_tbl
(username,password)
values
('$username','$password')
";
$res = mysql_query($str);
if(!res){
echo("ユーザ追加にエラーが発生しました \n");
}else{
echo("ユーザ追加に成功しました \n");
}
}else{
echo("パスワードが一致しません \n");
echo("もう一度行ってください \n");
}
}else{
echo("$username は既に存在します \n");
}
}
break;
case "passwd":
$username = mysql_real_escape_string($argv[2]);
if(!$username){
echo("ユーザ名を入力してください \n");
}else{
$str = "
select * from user_tbl
where
username = '$username'
";
$res = mysql_query($str);
$num = @mysql_num_rows($res);
if($num != 0){
echo("パスワードを入力してください:");
$password1 = fgets(STDIN,1024);
echo("もう一度入力してください:");
$password2 = fgets(STDIN,1024);
if($password1 == $password2){
$password = mysql_real_escape_string($password1);
$password = hash('sha256',$password);
$row = @mysql_fetch_assoc($res);
$user_id = $row['user_id'];
$str = "
update user_tbl
set
password = '$password'
where
user_id = '$user_id'
";
$res = mysql_query($str);
if(!res){
echo("パスワード変更にエラーが発生しました \n");
}else{
echo("パスワード変更に成功しました \n");
}
}else{
echo("パスワードが一致しません \n");
echo("もう一度行ってください \n");
}
}else{
echo("$username は存在しません \n");
}
}
break;
case "active":
$username = mysql_real_escape_string($argv[2]);
if(!$username){
echo("ユーザ名を入力してください \n");
}else{
$str = "
select * from user_tbl
where
username = '$username'
";
$res = mysql_query($str);
$num = @mysql_num_rows($res);
if($num != 0){
$row = @mysql_fetch_assoc($res);
$user_id = $row['user_id'];
$str = "
update user_tbl
set
active = '1'
where
user_id = '$user_id'
";
$res = mysql_query($str);
if(!res){
echo("ユーザ有効化処理にエラーが発生しました \n");
}else{
echo("ユーザ有効化処理に成功しました \n");
}
}else{
echo "ユーザが存在しません \n";
}
}
break;
case "del":
$username = mysql_real_escape_string($argv[2]);
if(!$username){
echo("ユーザ名を入力してください \n");
}else{
$str = "
select * from user_tbl
where
username = '$username'
";
$res = mysql_query($str);
$num = @mysql_num_rows($res);
if($num != 0){
$row = @mysql_fetch_assoc($res);
$user_id = $row['user_id'];
$str = "
update user_tbl
set
active = '0'
where
user_id = '$user_id'
";
$res = mysql_query($str);
if(!res){
echo("ユーザ無効化処理にエラーが発生しました \n");
}else{
echo("ユーザ無効化処理に成功しました \n");
}
}else{
echo("ユーザが存在しません \n");
}
}
break;
case "list":
$str = "select * from user_tbl";
$res = mysql_query($str);
$num = @mysql_num_rows($res);
if($num != 0){
echo "user_id \t username \t active \n";
while($row = @mysql_fetch_assoc($res)){
echo("$row[user_id] \t\t $row[username] \t $row[active] \n");
}
}else{
echo("ユーザは存在しません \n");
}
break;
case "email":
$username = mysql_real_escape_string($argv[2]);
if(!$username){
echo("ユーザ名を入力してください \n");
}else{
$str = "
select * from user_tbl
where
username = '$username'
";
$res = mysql_query($str);
$num = @mysql_num_rows($res);
if($num != 0){
echo("E-Mailアドレスを入力してください:");
$email1 = fgets(STDIN,1024);
echo("もう一度入力してください:");
$email2 = fgets(STDIN,1024);
if($email1 == $email2){
$email = trim($email1);
$email = mysql_real_escape_string($email);
$row = @mysql_fetch_assoc($res);
$user_id = $row['user_id'];
$str = "
update user_tbl
set
email = '$email'
where
user_id = '$user_id'
";
$res = mysql_query($str);
if(!res){
echo("E-Mailアドレス変更にエラーが発生しました \n");
}else{
echo("E-Mailアドレス変更に成功しました \n");
}
}else{
echo("E-Mailアドレスが一致しません \n");
echo("もう一度行ってください \n");
}
}else{
echo("$username は存在しません \n");
}
}
break;
}
?>また記事が長くなってしまったので、Part.3へ続く。






ディスカッション
コメント一覧
まだ、コメントがありません