WindowsのRDPを使ってクラウド上のLinuxインスタンスに接続する

# 1. はじめに

以前のエントリーでは、VcXsrv（Xming）やVNCなどを使い、WindowsクライアントでLinuxサーバーのGUIアプリを起動する方法を説明した。

* [Windowsクライアントを使って、クラウド上のLinuxサーバでGUIアプリを実行したい(1)](https://qiita.com/yamada-hakase/items/952406904beffb9f5e85) [(2)](https://qiita.com/yamada-hakase/items/80cef4ed58fefbba266b) [(3)](https://qiita.com/yamada-hakase/items/e1946b8a598f4cc0bcfa) [(4)](https://qiita.com/yamada-hakase/items/45922e8859283c44d7dc)
 <font color="blue">→全体像とXcXsrv</font>
* [クラウドでVNCサーバ＆クライアントを構成する Part 1](https://qiita.com/yamada-hakase/items/66c25e9439a0a4b6a909) [Part 2](https://qiita.com/yamada-hakase/items/3150d7bc6c024353c6bb) <font color="blue">→VNC</font>

ポートフォワーディングや踏み台利用なども含めて出し尽くしたと思っていたが、xrdpは本文中で紹介したのに詳細は説明していなかった。

そこで今回はxrdpについて説明する。なお前提知識として「[Windowsクライアントを使って…（1）](https://qiita.com/yamada-hakase/items/952406904beffb9f5e85)」 と「[クラウドでVNCサーバ＆クライアントを構成する Part 1](https://qiita.com/yamada-hakase/items/66c25e9439a0a4b6a909) 」は読んでいるものとする。

### 1-1. 前提条件

* RHEL系Linux OS（6/7/8/9）
* パブリック・クラウド・サービスを利用（ただし本文中ではOracle Cloud Infrastructureを利用）

※「Amazon Linux＝6系」「Amazon Linux 2＝7系」として読み替えてほしい。

# 2. xrdpとは

**xrdp**とは、LinuxにRDP（Microsoft Remote Desktop Protocol）を提供するサーバー・プログラムである。xrdpをインストールすることで、Windowsクライアントからリモート・デスクトップを使ってグラフィカル・リモート・ログインできる。

http://xrdp.org/

おもな特徴は以下のとおり。

* <font color="blue">Windowsクライアントのリモート・デスクトップから接続できるので、クライアント側はインストール不要</font>
* <font color="blue">フル・デスクトップ環境を利用できる</font>
* <font color="blue">VNCとは違い、通信内容は暗号化される</font>

このなかで「Windowsクライアントに何もインストールする必要が無い」のが一番のメリットだろう。企業ユースでは踏み台サーバーの権限が制限されていることが多く、一般ユーザーがプログラムをインストールできないことがあるからだ。

そして注意することが一つある。<font color="red">暗号化されていても、VPNなどを使わずに素のインターネットを使用するときは必ずポートフォワーディングすることだ。</font>

なぜならば、リモートデスクトップのポート番号は3389であり、攻撃対象になりやすい。そのため、ファイアウォールでアクセス元IPを制限してないと、誰でもログイン画面を表示できてしまう。

### 2-1. xrdpとVNCの比較

次の表はxrdpとVNCを比較したものだ。セキュリティ方式に違いがあるが、どちらも基本的にはポートフォワーディングと併用した方がいいだろう。<font color="red">VNCは使用するユーザー分のポートが必要なので、マルチユーザーアクセスが必要なシステムでは注意したい。</font>

|  | クライアント側に追加のソフトウェア | OSユーザーのパスワード設定 | 接続セキュリティ | 伝送路 | 利用するポート |
|:-:|:-:|:-:|:-:|:-:|:-:|
| xrdp  | 不要 | 必須 | OSのユーザー名/パスワード | 暗号化される | 3389のみ  |
| VNC  | 必要 | オプション | VNCパスワード | 暗号化されない  | 5901から利用する人数分 |


### 2-2. 設定手順

設定手順は以下のとおり。xrdpは、VNCのアドオン的な実装のため、設定方法はほとんど同じになっている。

1.xrdpを設定する
　- デスクトップ環境をインストールする
　- VNCサーバーをインストールする
　- xrdpをインストールする
　- xrdpを起動する
2.Linuxユーザーのパスワードを設定する
3.ファイアウォールを設定する
　- クラウドのファイアウォールを設定する
　- サーバーのファイアウォールを設定する
4.ポートフォワーディングする
5.Windowsクライアントからリモートデスクトップ接続する

# 3. xrdpを設定する

VNCと、ほとんど同じ手順なので簡潔に説明する。

### 3-1. デスクトップ環境をインストールする


**7/8/9系Linux OS**

```
yum groupinstall graphical-server-environment -y
```

**6系Linux OS**

```
yum groupinstall basic-desktop general-desktop japanese-support -y
```


### 3-2. VNCサーバーをインストールする


**Linux OS共通**

```
yum install tigervnc-server -y
```

### 3-3. EPELリポジトリを有効化する

xrdpはEPELから提供されている。そのため先にEPELリポジトリを有効にする。ただしAWSやOracle CloudではEPELを有効にする方法が異なるので注意すること。EPELの詳細は「[あらためてEPELリポジトリの使い方をまとめてみた](https://qiita.com/yamada-hakase/items/fdf9c276b9cae51b3633)」を参照のこと。

**9系Linux OS**

```
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm -y
```

**8系Linux OS**

```
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm -y
```

**7系Linux OS**

```
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -y
```

**6系Linux OS**

```
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm -y
```

**Amazon Linux 2**
Amazon Linux 2ではEPELを有効にするコマンドが提供されている。

```
sudo amazon-linux-extras install epel
```

### 3-4. xrdpをインストールする

コマンドは同じだが、7系と6系ではインストールされるパッケージは異なる。

**7/8/9系Linux OS**

```shell-session
# yum install xrdp -y
================================================================================
 Package              Arch           Version                 Repository    Size
================================================================================
Installing:
 xrdp                 x86_64         1:0.9.10-1.el7          epel         422 k
Installing for dependencies:
 xorgxrdp             x86_64         0.2.10-4.el7            epel          63 k
 xrdp-selinux         x86_64         1:0.9.10-1.el7          epel          17 k

Transaction Summary
================================================================================
Installed:
  xrdp.x86_64 1:0.9.10-1.el7

Dependency Installed:
  xorgxrdp.x86_64 0:0.2.10-4.el7       xrdp-selinux.x86_64 1:0.9.10-1.el7

Complete!
```


**6系Linux OS**

```shell-session
# yum install xrdp -y
Dependencies Resolved

================================================================================
 Package         Arch              Version                Repository       Size
================================================================================
Installing:
 xrdp            x86_64            0.6.1-4.el6            epel            244 k

Transaction Summary
================================================================================
Installed:
  xrdp.x86_64 0:0.6.1-4.el6

Complete!
```

### 3-5. xrdpを起動する

**7/8/9系Linux OS**

xrdpのサービスを起動する。

```shell-session
# systemctl start xrdp
# systemctl enable xrdp
```

次のように3389がリスニングされていれば正常に動作している。

```shell-session
# netstat -antup | grep xrdp
tcp        0      0 127.0.0.1:3350          0.0.0.0:*               LISTEN      12222/xrdp-sesman
tcp        0      0 0.0.0.0:3389            0.0.0.0:*               LISTEN      12223/xrdp
```

**6系Linux OS**

```shell-session
# service xrdp start
# chkconfig xrdp on
```

# 4. Linuxユーザーのパスワードを設定する

xrdpで接続するときは、sshログインではなくコンソール・ログインになる。そのためxrdpでログインするLinux OSユーザーにパスワードを設定する必要がある。

なお、ここでパスワードを設定しても、sshでパスワード・ログインが有効にはならないので安心してほしい。sshのパスワード・ログインの可否は/etc/ssh/sshd_configで設定できる。次のようにnoになっていれば、パスワードログインできない。

```
# grep ^Password /etc/ssh/sshd_config
PasswordAuthentication no
```

### 4-1. パスワードポリシーを理解する

LinuxではOSパスワードのポリシーを指定できる。ISOイメージからインストールしたときは何も設定されていないが、クラウド・サービスの提供イメージでは設定されていることがある。そのときにはパスワード・ポリシーに従ったパスワードの設定が必要だ。

なおパスワード・ポリシーの設定はLinuxディストリビューションによって異なる。RHEL7系とRHEL6系について説明する。

* RHEL7系以降（Amazon Linux 2含む）
* RHEL6系（Amazon Linux含む）
* Ubuntu

このあたりの詳細は以下の記事を参照のこと。

* [意外に複雑なパスワード生成事情とLinuxにおけるパスワード生成方法](https://qiita.com/yamada-hakase/items/7b4c8c662767f451edf7)

#### 4-1-1. RHEL7/8/9系

現在のパスワード・ポリシーは以下のコマンドで確認できる。表示されないときには設定されていない。

```shell-session:
$ grep -v -e '^\s*#' /etc/security/pwquality.conf
$ grep -v -e '^\s*#' /etc/security/pwquality.conf.d/*.conf
```

Amazon EC2のAmazon Linux 2では何も設定されていなかった。Oracle Cloud Infrastructure ComputeのOracle Linux 7/8/9では`oci.conf`が追加され、次のように設定されていた。

```shell-session:/etc/security/pwquality.conf.d/oci.conf
difok = 3       # 過去3回のパスワードは利用不可
minlen = 8      # パスワードが8文字以上
dcredit = -1    # 数字が1文字以上
ucredit = -1    # 大文字アルファベットが1文字以上
lcredit = -1    # 小文字アルファベットが1文字以上
ocredit = -1    # 記号が1文字以上
gecoscheck = 1  # /etc/passwdエントリのGECOSフィールドの単語が含まれていない
minclass=4      # 文字種別の数。4は数値、大文字、小文字、記号が必須
maxrepeat=3     # 連続した文字の最大数
```

#### 4-1-2. RHEL6系

RHEL6系のパスワード・ポリシーはpam_pwqualityではなくpam_pam_cracklibで管理している。設定値は次のコマンドで確認できる。

```shell-session
$ grep -v -e '^\s*#' /etc/pam.d/system-auth | grep ^password
```

何も表示されなければ設定されていない。先ほどと同様にOracle Cloud Infrastructure ComputeのOracle Linux 6では次のように設定されている。

```shell-session
password    requisite     pam_cracklib.so retry=3 minlen=8 difok=3 gecoscheck ocredit=-1 dcredit=-1 ucredit=-1 lcredit=-1 enforce_for_root
password    requisite     pam_pwhistory.so use_authtok enforce_for_root remember=4
password    sufficient    pam_unix.so sha512 shadow try_first_pass use_authtok remember=4
password    required      pam_deny.so
```

どのように設定されているかは、クラウド・サービスやLinux OSによって異なる。以下のファイルやヘルプを調べてほしい。

`man pam_pwquality`
`/etc/security/pwquality.conf`
`/etc/pam.d/system-auth`

### 4-2. パスワードを設定する

パスワードポリシーを理解したところで、必要なユーザー数分のパスワードを設定する。強度の高いパスワードを使用するにはpwmakeやpwgenで生成してもいいだろう。

```shell-session
# passwd ＜OSユーザー名＞
Changing password for user XXX.
New password: ★新しいパスワードを入力
Retype new password: ★確認のため同じパスワードを入力
passwd: all authentication tokens updated successfully.
```

# 5. ファイアウォールを設定する

Windowsクライアントから、どのようにLinuxサーバーに接続するかで、必要なファイアウォール設定は異なる。クラウドでは、次の3通りの接続方法が考えられる。

![xrdp-portforword01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/4b3f0fa2-b190-d599-9aee-f380d03b06ff.png)

ファイアウォールの設定は、以前「[クラウドでVNCサーバ＆クライアントを構成する Part 1](https://qiita.com/yamada-hakase/items/66c25e9439a0a4b6a909)」の「5. ファイアウォールを設定する」説明している。前回はVNCの5901番ポートだったのに対し、今回は3389番ポートになっただけだ。したがって具体的な説明は省略する。

### 5-1. クラウドのファイアウォールを設定する

「2.インターネット経由（踏み台あり）」と「3.専用線／インターネットVPN」のときは、Linuxサーバーに疎通できるように、クラウドのファイアウォールを設定する。

### 5-2. サーバーのファイアウォールを設定する

「2.インターネット経由（踏み台あり）」と「3.専用線／インターネットVPN」のときは、サーバーのファイアウォール（iptables/firewalld）でポートを開ける必要がある。具体的なコマンドは「[ソフトウェアファイアウォールの設定](https://qiita.com/yamada-hakase/items/66c25e9439a0a4b6a909#5-%E3%83%95%E3%82%A1%E3%82%A4%E3%82%A2%E3%82%A6%E3%82%AA%E3%83%BC%E3%83%AB%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B)」を見てほしい。

# 6. ポートフォワーディングする

接続方式の中で「1.インターネット経由（踏み台なし）」と「2.インターネット経由（踏み台あり）」のときはポートフォワーディングが必要になる。こちらも以前「[6. ポートフォワーディングを設定する](https://qiita.com/yamada-hakase/items/3150d7bc6c024353c6bb)」でPutty/Tera Termのそれぞれについて説明しているので、そちらを読んでほしい。

今回は以下のように設定しているものとする。
![xrdp02-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/02e6001e-147d-1b8e-b915-d0934cbb875a.png)

# 7. Windowsクライアントからリモートデスクトップ接続する

すべての準備が整ったので、WindowsクライアントからLinuxサーバーに接続しよう。

1. 「リモートデスクトップ接続」を起動する。入力する文字はポートフォワーディングの有無によって異なる。ポートフォワーディングなしのときは**「IPアドレス」**を入力する。ありのときは**「localhost:＜転送元ポート＞」**もしくは**「127.0.0.1:＜転送元ポート＞」**を入力する。
　
<font color="red">localhostで失敗するときは127.0.0.1を試すこと。</font>
　
**ポートフォワーディングなしのとき**
![xrdp03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/8655ca85-99bd-0b87-5abc-30caacd9f225.png)
**ポートフォワーディングありのとき**
![xrdp04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/d22ab373-abae-ed6a-255a-e534453dc16b.png)

1. 次のように警告が出ても**[接続]**をクリックする。
![xrdp05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/49709c19-3f76-5009-89bb-29c68c755c8d.png)
1. ここでも**[はい]**をクリックする。
![xrdp06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/0fa00ccc-3489-eaea-e755-2622bee2b165.png)
2. xrdpのログイン画面が表示されたら、Linuxユーザーのユーザー名とパスワードを入力する。
![xrdp07.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/0e312ca3-e03f-428d-c2a6-efd04aea4271.png)
1. Linuxのデスクトップ画面が表示できた。あとは言語などを設定すれば終了だ。
![xrdp08.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/f9472beb-8660-62a8-dbf7-9a3d4ca1ab45.png)

# 8. まとめ

* Windowsのリモート・デスクトップから接続できるので、クライアント側はインストール不要。管理者権限を持っていないWindowsクライアントでも利用できる

* xrdpを使うと、WindowsクライアントでLinuxのフルデスクトップ環境を利用できる

* ポートフォワーディングを併用すると、踏み台やクラウドのようなネットワークにも対応できる

# 9. 参考

* Windows のデスクトップ機能を使用して RHEL 7.3 の Amazon EC2 Linux インスタンスに接続するにはどうすればよいですか？
https://aws.amazon.com/jp/premiumsupport/knowledge-center/connect-to-rhel-73-windows/

* TigerVNC + XRDP on RHEL 7 (this shouldn't be so hard!)
https://access.redhat.com/discussions/2020503

* Install xrdp on CentOS 7 / RHEL 7
https://www.itzgeek.com/how-tos/linux/centos-how-tos/install-xrdp-on-centos-7-rhel-7.html

* HOW TO CONFIGURE XRDP REMOTE DESKTOP SERVER IN RHEL/CENTOS 7
https://www.itsmarttricks.com/how-to-configure-xrdp-remote-desktop-server-in-rhel-centos-7/

* How To Install xrdp on Red Hat Enterprise Linux 8
https://www.itzgeek.com/how-tos/linux/centos-how-tos/how-to-install-xrdp-on-red-hat-enterprise-linux-8.html