文章にすると分かりづらいけど、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