Windows Server 2025で作る踏み台サーバー

Windows Server 2025で作る踏み台サーバー

2026.03.11

はじめに

皆様こんにちは、あかいけです。

Windows Server 2025で踏み台サーバーを作りたいと思ったことはありますか?私はあります。
「いやいや、SSM Session Managerがあるでしょ?」と思われるかもしれません。
(私もそう思います)

ただ実際には、セキュリティポリシーでSSMエージェントの導入が許可されていなかったり、既存の運用フローがRDP前提で組まれていたりと、やむを得ない理由でSSM Session Managerを採用できないケースもあります。
そんなときに必要になるのが、昔ながらのRDPベースの踏み台サーバーです。

しかしいざ踏み台サーバーを構築するとなると、OSの基本設定やRDPのセッション設定、セキュリティポリシーなど考慮すべき項目が意外と多く、手作業で設定するのはなかなか骨が折れます。

そこで今回はRD Gateway(リモートデスクトップゲートウェイ)を利用して、HTTPS(443)経由でRDP接続できるように設定するところまで含めて、Terraformとユーザーデータで一発構築できるようにまとめました。

なお、記事内のTerraformのコード全体はGitHubリポジトリに載せているので、この記事ではインスタンスの設定とユーザーデータの設定を抜粋して解説します。

https://github.com/Lamaglama39/remote-desktop-sample-terraform

今回の構成

スクリーンショット 2026-03-07 5.57.15

VPC内にパブリックサブネットとプライベートサブネットを用意し、パブリックサブネットにRD Gatewayを設定した踏み台サーバー(Bastion)を配置しています。
クライアントからはインターネット経由でHTTPS(443)を使って踏み台サーバーに接続し、そこからプライベートサブネット上のアプリケーションサーバー(App)にRDP(3389)で接続する流れです。

また、RD Gatewayの自己署名証明書はS3バケットにアップロードしておき、クライアントPCへの配布に利用します。

どんな設定にする?

まずはユーザーデータの中身に入る前に、「何を設定すべきか」を整理しておきます。
Windows Serverの踏み台サーバーで考慮すべき項目は、大きく「Windows Server共通の設定」「踏み台サーバー固有の設定」の2種類に分けられます。

ここではいくつか例を挙げますが、あくまで設定例です。
実際に構築する際はプロジェクトのセキュリティ要件や運用ルールに応じて適切な値を設定してください。
また今回は踏み台サーバーの構築にフォーカスしているため、Active Directoryとの連携や監査ログの設定など、実際の運用で必要になる項目は省略しています。

Windows Server共通の設定

Windows Serverを立てる際に、用途を問わず共通で設定しておきたい項目です。

設定項目 設定例 理由
コンピュータ名 任意のホスト名 デフォルトのランダムな名前だと管理しづらいため
タイムゾーン Tokyo Standard Time デフォルトはUTCなので、日本で運用するなら変更が必要
パスワードポリシー 最小12文字、複雑さ有効、ロックアウト閾値5回 セキュリティ要件に応じて適切に設定
パスワード有効期限 無期限 運用負荷を考慮して無期限にするケースが多い
Windows Update 自動更新無効 意図しないタイミングでのアップデートを防ぐ

踏み台サーバー固有の設定

踏み台サーバー特有の設定です。RDP(リモートデスクトップ)のセッション設定と、RD Gatewayの設定に分けられます。

RDPセッション設定

設定項目 設定例 理由
セッションタイムアウト 180分 放置されたセッションがリソースを食い続けるのを防ぐ
同時接続数 2セッション 複数人が同時に踏み台を利用できるようにする
クリップボード共有 許可 ローカルPCとの間でテキストのコピー&ペーストを可能にする
ドライブリダイレクト 許可 ローカルPCのドライブを踏み台サーバー上から参照できるようにする

なお、クリップボード共有とドライブリダイレクトはセキュリティ要件によって判断が分かれるポイントです。
情報の持ち出しリスクを厳密に管理したい場合は、どちらも無効にすることを検討してください。

RD Gateway設定

設定項目 設定例 理由
SSL証明書 自己署名証明書(有効期限10年) HTTPS通信に必要。本番では正規CA証明書の利用を推奨
接続承認ポリシー(CAP) Administrators、Remote Desktop Usersを許可 RD Gatewayへの接続を許可するユーザーグループを定義
CAPアイドルタイムアウト 180分 RD Gateway経由の接続がアイドル状態で放置されるのを防ぐ
リソース承認ポリシー(RAP) ゲートウェイ管理グループで接続先サーバーを制限 RD Gateway経由で接続できるサーバーをきめ細かく制御

RD Gatewayについて

RD Gateway(Remote Desktop Gateway)は、Microsoftが提供するWindows Serverの役割の一つで、HTTPS(443)を経由してRDP接続をトンネリングする仕組みです。

https://learn.microsoft.com/en-us/windows-server/remote/remote-desktop-services/remote-desktop-gateway-role

通常のRDP接続ではTCPの3389番ポートを使用しますが、RD Gatewayを利用することでHTTPS(443)にカプセル化して通信を行います。

そのためRD Gatewayは「セキュリティ要件でRDPはインターネットへ公開できない…」、といった場合に利用されることが多いです。

Terraformの設定(抜粋)

Terraformのコード全体はGitHubリポジトリを参照してください。
ここではEC2インスタンスの設定とユーザーデータの呼び出し部分を抜粋します。

https://github.com/Lamaglama39/remote-desktop-sample-terraform

EC2インスタンスの設定

templatefile関数でユーザーデータのテンプレートにTerraform側の変数を渡しています。
例えばhostnames3_bucketなどの値はテンプレート内で${hostname}のように参照されます。

resource "aws_instance" "bastion" {
  ami                         = data.aws_ami.windows2025.id
  instance_type               = "t3.large"
  key_name                    = aws_key_pair.bastion.key_name
  subnet_id                   = aws_subnet.public.id
  private_ip                  = var.bastion_private_ip
  vpc_security_group_ids      = [aws_security_group.bastion.id]
  iam_instance_profile        = aws_iam_instance_profile.bastion.name
  associate_public_ip_address = true
  disable_api_termination     = false
  disable_api_stop            = false
  monitoring                  = false

  metadata_options {
    http_endpoint = "enabled"
    http_tokens   = "required"
  }

  root_block_device {
    volume_size           = 50
    volume_type           = "gp3"
    encrypted             = true
    delete_on_termination = true
  }

  user_data = templatefile("${path.module}/templates/userdata_bastion.ps1.tpl", {
    hostname           = "${var.name_prefix}-bastion01"
    s3_bucket          = aws_s3_bucket.cert.bucket
    aws_region         = var.aws_region
    allowed_server_ips = [var.bastion_private_ip, var.app_private_ip]
  })

  tags = {
    Name = "${var.name_prefix}-bastion"
  }
}

セキュリティグループの設定

踏み台サーバーのセキュリティグループでは、インバウンドルールにHTTPS(443)のみを許可しています。
RD Gatewayの設定も含めて後述のユーザーデータで実行しているため、RDP(3389)をインターネットに公開する必要はありません。

resource "aws_security_group_rule" "bastion_ingress_https" {
  type              = "ingress"
  security_group_id = aws_security_group.bastion.id
  from_port         = 443
  to_port           = 443
  protocol          = "tcp"
  cidr_blocks       = [local.my_ip_cidr]
  description       = "HTTPS access for RD Gateway from my IP"
}

ユーザーデータ

ここからは実際のユーザーデータの中身を解説していきます。
今回のユーザーデータは大きく6つのフェーズに分かれています。

  1. OSの基本設定
  2. RDPセッション設定
  3. RD Gatewayのインストール
  4. 自己署名証明書の作成
  5. RD Gatewayの設定(CAP/RAP)
  6. 証明書のS3アップロード

なお前述のとおりTerraformのtemplatefile関数で変数を埋め込む前提で書いています。
${hostname}のような記述はTerraform側から渡される変数です。

1.OSの基本設定

コンピュータ名の設定

# Set computer name (applied after reboot)
Rename-Computer -NewName "${hostname}" -Force

Rename-Computerコマンドレットでコンピュータ名を変更します。
デフォルトだとEC2のインスタンスIDベースのランダムな名前が付与されるので、管理しやすい名前に変更しておきましょう。

なおコンピュータ名の変更はOS再起動後に反映されるため、ユーザーデータの最後で再起動を行っています。

タイムゾーン設定

# Set timezone to Tokyo Standard Time
Set-TimeZone -Id "Tokyo Standard Time"

Windows ServerのデフォルトタイムゾーンはUTCです。
日本国内のシステムで利用する場合はJST(Tokyo Standard Time)に変更しておかないと、ログの時刻などもずれて運用時に混乱の原因になります。

パスワードポリシー設定

# Password policy: min 12 chars, lockout threshold 5, no expiration
net accounts /MINPWLEN:12 /LOCKOUTTHRESHOLD:5 /MAXPWAGE:UNLIMITED

net accountsコマンドでパスワードポリシーをまとめて設定しています。各オプションの意味は以下のとおりです。

オプション 設定値 意味
/MINPWLEN 12 パスワードの最小文字数を12文字に設定
/LOCKOUTTHRESHOLD 5 パスワードを5回間違えるとアカウントがロックされる
/MAXPWAGE UNLIMITED パスワードの有効期限を無期限に設定

パスワードの複雑さ設定

# Enable password complexity (3 of 4 types: upper/lower/digit/symbol)
secedit /export /cfg C:\Windows\Temp\secpol.cfg
(Get-Content C:\Windows\Temp\secpol.cfg) -replace 'PasswordComplexity = 0','PasswordComplexity = 1' |
    Set-Content C:\Windows\Temp\secpol.cfg
secedit /configure /db C:\Windows\security\local.db /cfg C:\Windows\Temp\secpol.cfg /areas SECURITYPOLICY
Remove-Item C:\Windows\Temp\secpol.cfg

パスワードの複雑さの要件を有効にしています。
この設定を有効にすると、パスワードには英大文字・英小文字・数字・記号の4種類のうち3種類以上を含める必要があります。

この設定はnet accountsコマンドでは変更できないため、seceditコマンドでローカルセキュリティポリシーを直接編集しています。
処理の流れとしては以下のとおりです。

  1. 現在のセキュリティポリシーを一時ファイルにエクスポート
  2. PasswordComplexityの値を0(無効)から1(有効)に置換
  3. 修正したポリシーをシステムに適用
  4. 一時ファイルを削除してお掃除

Administratorのパスワード無期限設定

# Set Administrator password to never expire
Set-LocalUser -Name "Administrator" -PasswordNeverExpires $true

ビルトインのAdministratorアカウントに対して、パスワードの有効期限を無期限に設定しています。

先ほどnet accounts/MAXPWAGE:UNLIMITEDでOSのデフォルトポリシーとしてパスワード有効期限を無期限に設定しました。
一方こちらはAdministratorアカウント個別の設定です。
こちらを設定することで、既存のAdministratorも確実にパスワード無期限にします。

Windows Update自動更新の無効化

# Disable Windows Update auto-update (manual only)
$wuPath = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU"
if (-not (Test-Path $wuPath)) {
    New-Item -Path $wuPath -Force | Out-Null
}
Set-ItemProperty -Path $wuPath -Name "NoAutoUpdate" -Value 1 -Type DWord

Windows Updateの自動更新を無効化しています。
ここは運用次第ですが、手動でのアップデートや定期的なアップデートで運用する場合は、自動更新は無効化しておきます。

レジストリキーが存在しない場合はNew-Itemで作成してから値を設定するようにしています。

2.RDPセッション設定

New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" -Force | Out-Null
# Session idle timeout: 180 min (10800000 ms)
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" -Name "MaxIdleTime" -Value 10800000 -Type DWord
# Max concurrent sessions: 2
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" -Name "MaxInstanceCount" -Value 2 -Type DWord
# Clipboard sharing: allow (0=allow)
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" -Name "fDisableClip" -Value 0 -Type DWord
# Drive redirection: allow (0=allow)
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" -Name "fDisableCdm" -Value 0 -Type DWord

RDPの各種設定はレジストリのHKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services配下で管理されています。
Set-ItemPropertyで各レジストリキーの値を設定していきます。

レジストリ名 設定値 意味
MaxIdleTime 10800000 アイドルセッションのタイムアウト(ミリ秒)。180分 = 10,800,000ミリ秒
MaxInstanceCount 2 RDPの同時接続数の上限
fDisableClip 0 クリップボード共有の無効化フラグ。0=許可、1=拒否
fDisableCdm 0 ドライブリダイレクトの無効化フラグ。0=許可、1=拒否

fDisableClipfDisableCdm無効化フラグなので、値が0で「許可」、1で「拒否」になる点に注意してください。直感と逆なのでちょっとややこしいですね。

3.RD Gatewayのインストール

Install-WindowsFeature RDS-Gateway -IncludeAllSubFeature -IncludeManagementTools

Windows ServerにRD Gatewayの役割をインストールします。
-IncludeAllSubFeatureで関連するサブ機能をすべて含め、-IncludeManagementToolsで管理ツールも一緒にインストールしています。

4.自己署名証明書の作成

Import-Module RemoteDesktopServices

# Get public IP (EIP) via IMDSv2 and use as certificate DnsName
$token = Invoke-RestMethod -Method PUT -Uri "http://169.254.169.254/latest/api/token" -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"}
$dnsName = Invoke-RestMethod -Uri "http://169.254.169.254/latest/meta-data/public-ipv4" -Headers @{"X-aws-ec2-metadata-token" = $token}
$cert = New-SelfSignedCertificate -CertStoreLocation Cert:\LocalMachine\My -DnsName $dnsName -NotAfter (Get-Date).AddYears(10)

RD GatewayはHTTPSで通信するため、SSL証明書が必要です。
本番環境では正規のCA証明書を使用するのが望ましいですが、今回は検証も兼ねて自己署名証明書を作成して適用します。

証明書の-DnsNameにはクライアントからの接続先となるアドレスを指定する必要があるため、ここではIMDSv2(Instance Metadata Service v2)を使ってEC2インスタンスに割り当てられたEIP(パブリックIP)を動的に取得しています。

また-NotAfter (Get-Date).AddYears(10)で有効期限を10年に設定しています。

5.RD Gatewayの設定

SSL証明書の適用

# Bind SSL certificate
Set-Location RDS:\GatewayServer\SSLCertificate
Set-Item .\Thumbprint -Value $cert.Thumbprint

作成した自己署名証明書をRD Gatewayに適用します。
証明書のThumbprintを指定して紐付けます。

接続承認ポリシー(CAP)の作成

# Create Connection Authorization Policy (CAP)
New-Item -Path RDS:\GatewayServer\CAP -Name "Default-CAP" `
    -UserGroups @("administrators@BUILTIN", "Remote Desktop Users@BUILTIN") `
    -AuthMethod 1

接続承認ポリシー(CAP: Connection Authorization Policy)は「誰がRDゲートウェイに接続できるか」を定義するポリシーです。

パラメータ 説明
Name Default-CAP ポリシー名
UserGroups administrators@BUILTIN, Remote Desktop Users@BUILTIN 接続を許可するユーザーグループ
AuthMethod 1 パスワード認証

ローカルのAdministratorsグループとRemote Desktop Usersグループに属するユーザーに対して、パスワード認証での接続を許可しています。

リソース承認ポリシー(RAP)の作成

# Create managed computer group for allowed servers
New-Item -Path RDS:\GatewayServer\GatewayManagedComputerGroups -Name "Allowed-Servers" `
    -Description "Servers accessible via RD Gateway" `
    -Computers @(${join(", ", [for ip in allowed_server_ips : "\"${ip}\""])})
Set-Item -Path "RDS:\GatewayServer\CAP\Default-CAP\IdleTimeout" -Value 180

# Create Resource Authorization Policy (RAP)
New-Item -Path RDS:\GatewayServer\RAP -Name "Default-RAP" `
    -UserGroups @("administrators@BUILTIN", "Remote Desktop Users@BUILTIN") `
    -ComputerGroupType 0 `
    -ComputerGroup "Allowed-Servers"

リソース承認ポリシー(RAP: Resource Authorization Policy)は「RDゲートウェイ経由でどのサーバーに接続できるか」を定義するポリシーです。

まず接続先サーバーをまとめた管理グループ「Allowed-Servers」を作成します。
-ComputersパラメータにはTerraformのtemplatefile関数でallowed_server_ips変数から接続先サーバーのIPアドレスを展開して渡しています。

続いて、先ほど作成したCAPのIdleTimeoutを180分に設定してアイドル状態のセッションを自動切断するようにしています。

次にRAPを作成し、Allowed-Serversグループへの接続を許可します。

パラメータ 説明
ComputerGroupType 0 RDゲートウェイ管理グループを使用
ComputerGroup Allowed-Servers 接続先サーバーグループ名

サービス再起動

# Restart RD Gateway service to apply settings
Restart-Service TSGateway

RDゲートウェイサービスを再起動して設定を反映させます。

6.証明書のS3アップロード

# Export certificate for client distribution (public key only)
$cerPath = "C:\Windows\Temp\rdgateway.cer"
$cert | Export-Certificate -FilePath $cerPath -Force -Type CERT

# Upload to S3 (AWS.Tools.S3 is pre-installed on Windows AMIs)
Import-Module AWS.Tools.S3
Write-S3Object -BucketName "${s3_bucket}" -File $cerPath -Key "certs/rdgateway.cer" -Region "${aws_region}"
Remove-Item $cerPath -Force

自己署名証明書を使用する場合、接続元のクライアントPCにこの証明書をインポートする必要があります。
証明書を手動でサーバーからダウンロードするのは手間なので、S3バケットにアップロードしておきます。

AWS.Tools.S3モジュールはWindows Server 2025のAMIにプリインストールされているため、追加インストールなしで利用できます。
なお、S3にアクセスするためにはEC2インスタンスにIAMロール(インスタンスプロファイル)が設定されている必要があります。

再起動

# Reboot to apply computer name change
Restart-Computer -Force

最後にOSを再起動します。コンピュータ名の変更を反映させるために必要です。

ユーザーデータ全量

上記で解説した内容をまとめたユーザーデータは以下のとおりです。

<powershell>
# ============================================================================
# Phase 1: Basic OS Configuration
# ============================================================================

# Set computer name (applied after reboot)
Rename-Computer -NewName "${hostname}" -Force

# Set timezone to Tokyo Standard Time
Set-TimeZone -Id "Tokyo Standard Time"

# Password policy: min 12 chars, lockout threshold 5, no expiration
net accounts /MINPWLEN:12 /LOCKOUTTHRESHOLD:5 /MAXPWAGE:UNLIMITED

# Enable password complexity (3 of 4 types: upper/lower/digit/symbol)
secedit /export /cfg C:\Windows\Temp\secpol.cfg
(Get-Content C:\Windows\Temp\secpol.cfg) -replace 'PasswordComplexity = 0','PasswordComplexity = 1' |
    Set-Content C:\Windows\Temp\secpol.cfg
secedit /configure /db C:\Windows\security\local.db /cfg C:\Windows\Temp\secpol.cfg /areas SECURITYPOLICY
Remove-Item C:\Windows\Temp\secpol.cfg

# Set Administrator password to never expire
Set-LocalUser -Name "Administrator" -PasswordNeverExpires $true

# Disable Windows Update auto-update (manual only)
$wuPath = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU"
if (-not (Test-Path $wuPath)) {
    New-Item -Path $wuPath -Force | Out-Null
}
Set-ItemProperty -Path $wuPath -Name "NoAutoUpdate" -Value 1 -Type DWord

# ============================================================================
# Phase 2: RDP Session Settings
# ============================================================================

New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" -Force | Out-Null
# Session idle timeout: 180 min (10800000 ms)
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" -Name "MaxIdleTime" -Value 10800000 -Type DWord
# Max concurrent sessions: 2
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" -Name "MaxInstanceCount" -Value 2 -Type DWord
# Clipboard sharing: allow (0=allow)
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" -Name "fDisableClip" -Value 0 -Type DWord
# Drive redirection: allow (0=allow)
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" -Name "fDisableCdm" -Value 0 -Type DWord

# ============================================================================
# Phase 3: Install RD Gateway Role
# ============================================================================

Install-WindowsFeature RDS-Gateway -IncludeAllSubFeature -IncludeManagementTools

# ============================================================================
# Phase 4: Create Self-Signed Certificate
# ============================================================================

Import-Module RemoteDesktopServices

# Get public IP (EIP) via IMDSv2 and use as certificate DnsName
$token = Invoke-RestMethod -Method PUT -Uri "http://169.254.169.254/latest/api/token" -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"}
$dnsName = Invoke-RestMethod -Uri "http://169.254.169.254/latest/meta-data/public-ipv4" -Headers @{"X-aws-ec2-metadata-token" = $token}
$cert = New-SelfSignedCertificate -CertStoreLocation Cert:\LocalMachine\My -DnsName $dnsName -NotAfter (Get-Date).AddYears(10)

# ============================================================================
# Phase 5: Configure RD Gateway
# ============================================================================

# Bind SSL certificate
Set-Location RDS:\GatewayServer\SSLCertificate
Set-Item .\Thumbprint -Value $cert.Thumbprint

# Create Connection Authorization Policy (CAP)
New-Item -Path RDS:\GatewayServer\CAP -Name "Default-CAP" `
    -UserGroups @("administrators@BUILTIN", "Remote Desktop Users@BUILTIN") `
    -AuthMethod 1

# Create managed computer group for allowed servers
New-Item -Path RDS:\GatewayServer\GatewayManagedComputerGroups -Name "Allowed-Servers" `
    -Description "Servers accessible via RD Gateway" `
    -Computers @(${join(", ", [for ip in allowed_server_ips : "\"${ip}\""])})
Set-Item -Path "RDS:\GatewayServer\CAP\Default-CAP\IdleTimeout" -Value 180

# Create Resource Authorization Policy (RAP)
New-Item -Path RDS:\GatewayServer\RAP -Name "Default-RAP" `
    -UserGroups @("administrators@BUILTIN", "Remote Desktop Users@BUILTIN") `
    -ComputerGroupType 0 `
    -ComputerGroup "Allowed-Servers"

# Restart RD Gateway service to apply settings
Restart-Service TSGateway

# ============================================================================
# Phase 6: Export Certificate to S3
# ============================================================================

# Export certificate for client distribution (public key only)
$cerPath = "C:\Windows\Temp\rdgateway.cer"
$cert | Export-Certificate -FilePath $cerPath -Force -Type CERT

# Upload to S3 (AWS.Tools.S3 is pre-installed on Windows AMIs)
Import-Module AWS.Tools.S3
Write-S3Object -BucketName "${s3_bucket}" -File $cerPath -Key "certs/rdgateway.cer" -Region "${aws_region}"
Remove-Item $cerPath -Force

# Reboot to apply computer name change
Restart-Computer -Force
</powershell>

クライアント側の接続設定

証明書のダウンロード

自己署名証明書を使用しているため、接続元のクライアントPCに証明書をインポートする必要があります。
なのでS3バケットからrdgateway.cerをダウンロードして、インポートしておきます。

スクリーンショット 2026-03-07 4.50.49

リモートデスクトップ接続の設定

ここではWindows App(旧:Microsoft Remote Desktop)を例に説明します。
接続先の設定画面で、「PC name」に接続先サーバーのプライベートIP、「Gateway」に踏み台サーバーのEIPを入力します。

スクリーンショット 2026-03-07 4.52.17

接続すると、RDゲートウェイの認証情報を求められます。
ユーザー名とパスワードを入力してください。

スクリーンショット 2026-03-07 4.52.54

次に証明書の信頼に関する警告が表示されるので、問題なければContinueします

スクリーンショット 2026-03-07 4.53.04

RDゲートウェイを経由して接続先サーバーに接続する際、接続先サーバーの認証情報を改めて求められます。
接続先サーバーのユーザー名とパスワードを入力してください。

スクリーンショット 2026-03-07 5.03.43

おまけ: ユーザーデータの実行結果の確認方法

ユーザーデータがちゃんと動いたか確認したいとき、ありますよね?
Windows ServerのEC2インスタンスでは、ユーザーデータの実行に関するファイルが以下のパスに保存されています。

種類 パス
ユーザーデータ本体 C:\Windows\System32\config\systemprofile\AppData\Local\Temp\EC2Launch<ランダム値>\UserScript.ps1
標準出力 C:\Windows\System32\config\systemprofile\AppData\Local\Temp\EC2Launch<ランダム値>\output.tmp
エラー出力 C:\Windows\System32\config\systemprofile\AppData\Local\Temp\EC2Launch<ランダム値>\err.tmp

ユーザーデータ実行時にエラーが発生した場合はerr.tmpを確認すれば原因がわかります。
パス中の<ランダム値>は実行ごとに異なるので、該当ディレクトリ内のフォルダを確認して探してください。

さいごに

以上、Windows Server 2025のユーザーデータで踏み台サーバーの初期設定からRD Gatewayの設定までを一括で作成する方法でした。

手動でポチポチ設定するのは何回やっても気が滅入りますが、ユーザーデータにしておけばTerraformと組み合わせて一発でデプロイできるのでかなり楽になります。
この記事が誰かのお役に立てば幸いです。

この記事をシェアする

FacebookHatena blogX

関連記事