リモートデスクトップを特定のIPのみで接続するようにして、さらにPHPを使ってIPアドレス追加許可する

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

 

↓弊社で開発、販売しているソフトウェアです↓

MediMonitor無料ダウンロード  

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です