文章にすると分かりづらいけど、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にしてください。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950using 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
123456789101112131415161718192021<?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