リモートデスクトップを特定の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

 

Apacheでセキュリティのため限られたIPのみのアクセスにしたい場合、PHPを使って.htaccessにアクセス元のグローバルIPを追加する方法

apacheなどのWEBサーバーを運用さしているときにプライベートのサーバーだと外部からのアクセスがあるとあまり宜しくない時がある。

その時は

order deny,allow
deny from all

で全部を拒否さして

allow from xxx.xxx.xxx.xxx

などで個別にアクセス出来るようにすると非常に安全になる。

でもIPが定まらないときすごくめんどくさい。

どうしようかなと思ったら.htaccessにPHPから追加出来ることがわかった。

これだと特定のディレクトリのURLにアクセスすることで、Apache全体にアクセス許可を与える事になってセキュリティがアップする。

簡単に言うと

http://yoursite.com/

にアクセス

403エラーForbidden あなたがアクセスしたページはインターネット上に存在はするが閲覧することが許可されていません。

http://yoursite.com/allowaccess.php

にアクセス

200 アクセス許可を与えました!

http://yoursite.com/

にアクセス

200 成功 ようこそ!

となる

これを応用してWordpressのログイン画面のwp-login.phpだけのアクセスを制限さしたり出来る。

特定のファイルだけアクセス制限したい場合は

すでにある.htaccessに

<Files wp-login.php>
Order deny,allow
Deny from all
</Files>

を最後に追加しましょう。

ディレクトリ全部の場合は

order deny,allow
deny from all

だけでいいです。でもその場合違うサブディレクトリを新しく作ってそこの.htaccessで

allow from all

をしてあげてね

アクセス権限を与えるやり方

ホームディレクトリの

.htaccess

# BEGIN WordPress
&amp;amp;lt;IfModule mod_rewrite.c&amp;amp;gt;
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
&amp;amp;lt;/IfModule&amp;amp;gt;

# END WordPress
&amp;amp;lt;Files wp-login.php&amp;amp;gt;
Order deny,allow
Deny from all
allow from 101.140.66.155
&amp;amp;lt;/Files&amp;amp;gt;

と同じディレクトリに新規でファイルを作成

allowaccess.php

 

&amp;amp;lt;?php
$file = dirname(__FILE__) . "/.htaccess"; // 一つ上のディレクトリなら /../.htaccess です。
$remainLastLetter = 8; // 最後に&amp;amp;lt;/Files&amp;amp;gt;などある場合は8を入力して文字を保護をしてください。

if (! file_exists($file)) {
    exit(".htaccessファイルが存在しないかアクセスできません。");
}
$ip = $_SERVER["REMOTE_ADDR"];

$addAllowIP = "allow from " . $ip;
$originalHtaccess = file_get_contents($file);
if (strpos($originalHtaccess, $addAllowIP) !== false) {
    exit("すでにIPが登録されています。");
}

$lastLetters = "";
if ($remainLastLetter &amp;amp;gt; 0)
    $lastLetters = substr($originalHtaccess, - $remainLastLetter);
$startLetters = substr($originalHtaccess, 0, strlen($originalHtaccess) - $remainLastLetter);
$newHtaccess = $startLetters . $addAllowIP . "\n" . $lastLetters;
if (file_put_contents($file, $newHtaccess)) {
    echo $ip . "のアクセス許可を与えました";
} else {
    exit(".htaccessファイルの書き込みに失敗しました。アクセス権を確認してください。");
}

 

上をコピーして貼り付けてください。

自作なので汚くてすいません。

$remainLastLetterと$file は適宜変更してください。

これでhttp://yoursite.com/allowaccess.phpにアクセスするだけでアクセス権を得られてセキュリティがアップします!

※↑のPHPファイルと.htaccessファイルがおかしいのでサーバーにアップロードしました。

こちらからダウンロード