文章にすると分かりづらいけど、PHPから指定したURLにアクセスした場合(そのときパスワードを掛けてもいい)そのアクセスしたIPアドレスをリモートディスクトップの受信の規則に追加してリモートデスクトップ(RDP)のセキュリティを高める方法です。
ポートが完全に反応しなくなるのでポートスキャンにも有効ですし、不正アクセス対策としてはかなり強いと思います。
また特定のURLにアクセスするだけで、利用を許可でき、利便性も高いと思います
デメリットとしては、Windowsのファイヤーウォールのルールにドンドン溜まっていくので、たまに整理しないといけないぐらいですね
でもセキュリティを考えたらIPを制限するのは大事だと思います
前回やったApacheのPHPのアクセス制限と少しだけ似てます。やってることは結構違うけど。
やり方として、まずRDPはローカルや特定のIPだけしか許可しないようにします。
それは他のサイトでも書いてるのであまり解説しませんが、Windows Defenderファイアウォールを開いて、リモートデスクトップ – ユーザーモード(TCP 受信)とリモートデスクトップ – ユーザーモード(UDP 受信)のリモートアドレスのスコープを任意のIPアドレスからこれらのIPアドレスにします。
私は127.0.0.1と192.168.1.0/24を追加しました。
それで、ここからがオリジナルです
C#を使ったWindows FirewallにAllow IP追加するオリジナルプログラムのEXEのプログラムを作成します。
Visual Studio 2019 communityで作成しました
新規作成→新しいプロジェクト→コンソールアプリ(.NET Framework)C#を選んで、名前は「add_ip_to_windows_firewall」で対象フレームワークは.NET Framework 4.5にしてください。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using NetFwTypeLib;
namespace add_ip_to_windows_firewall
{
class Program
{
public const int NET_FW_IP_PROTOCOL_TCP = 6;
public const int NET_FW_IP_PROTOCOL_UDP = 17;
public static void addRule(String ip, String port, int protocol)
{
INetFwRule firewallRule = (INetFwRule)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FWRule"));
firewallRule.Action = NET_FW_ACTION_.NET_FW_ACTION_ALLOW;
firewallRule.Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_IN;
firewallRule.RemoteAddresses = ip;
firewallRule.Protocol = protocol;
firewallRule.LocalPorts = port;//複数の場合は8051,8052,8053など
firewallRule.Enabled = true;
firewallRule.InterfaceTypes = "All";
firewallRule.Name = "RDP IP permission : " + ip;
INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
firewallPolicy.Rules.Add(firewallRule);
}
static void Main(string[] args)
{
if (args.Length == 0)
{
Console.WriteLine("ERROR!!! Please set IP in args....");
System.Threading.Thread.Sleep(5000);
}
else
{
string ip = args[0];
Console.WriteLine("allow access to " + ip);
addRule(ip, port: "3389", protocol: NET_FW_IP_PROTOCOL_TCP);
addRule(ip, port: "3389", protocol: NET_FW_IP_PROTOCOL_UDP);
Console.WriteLine("May Be Success!" + ip);
}
}
}
}
上がソースコードです。
貼り付けてコンパイルしてください。NetFwTypeLibがmissingの場合は参照から
参照の追加でSystem32にあるFirewallAPI.dllを選択してOKしてください。
んで出来上がったadd_ip_to_windows_firewallをPHPが実行出来るWEBサーバーのディレクトリにおいてください。
以下のPHPファイルも作成しておいてください。
index.php
<?php
error_reporting(E_ALL);
try {
$myExeFile = dirname(__FILE__) . '/add_ip_to_windows_firewall.exe';
if (! file_exists($myExeFile)) {
echo $myExeFile;
exit("exeファイルが無いです");
}
$ip = $_SERVER["REMOTE_ADDR"];
$exeCommand = $myExeFile . " " . $ip;
echo "処理を実行します";
echo "
";
echo exec($exeCommand);
echo "
";
echo "allow access to xxx が出たら成功です!";
} catch (Exception $e) {
echo $e->getMessage();
}
?>
WEBサーバーで同じディレクトリに
.htaccess(必要ならでallow from allだけとか)
index.php(ファイル名は何でもいい。むしろ複雑なほどいい)
add_ip_to_windows_firewall.exe
の3つおいてください。
Apacheの権限を管理者権限で実行させるようにして、ディレクトリにhttp://yousite/addiprdp/index.phpにアクセス
するとwindows firewallにRDPアクセス許可するIPが新しく追加されているはずです!
add_ip_to_windows_firewall.exeを試したい場合は引数にIPアドレスを入れて管理者権限でCMDを実行さしてください。
コンパイルとか面倒くさいなら自己責任で↓からダウンロードして使ってください。Windows 10 pro で動かしました
add_ip_to_windows_firewall_php_ver