XRDP Remote Desktop のインストール

XRDP をインストールすると、Windows のリモートデスクトップ機能を使用して Fedora に接続できるのでとても便利です。以下は Fedora 22 で動作確認しました。ログインユーザは wheel グループに属するユーザ(admin user)を用いて確認しました。

xrdp パッケージをインストール

# dnf install xrdp -y

SELinux をいったん Permissive に変更

xrdp を起動する前にいったん SELinux を Permissive に変更します。これをしないと xrdp サービスの起動に失敗する場合があります。最終的には SELinux 関連の設定をおこない、その後に Enforcing に戻すことにします。

# setenforce 0

xrdp サービス起動・有効化

xrdp サービス起動・有効化します。

# systemctl enable xrdp.service
# systemctl start xrdp.service

# systemctl enable xrdp-sesman.service
# systemctl start xrdp-sesman.service

正常起動されていることを確認します。以下のように「active (running)」と表示されていれば OK です。

# systemctl status xrdp
  ...
  Active: active (running) ...
  ...

Firewall の xrdp ポートを開く

現在の Firewall ゾーンを取得します。Fedora Live CD を使ってインストールした環境では、デフォルトでは「FedoraWorkstation」になっています。

# ZONE=`firewall-cmd --get-active-zone|head -1`
# echo $ZONE
FedoraWorkstation

サービスの一覧を取得し、「ms-wbt」が存在することを確認します。「ms-wbt」とは Microsoft Windows Based Terminal の略で Windows Remote Desktop を意味します。「ms-wbt」は 3389/tcp ポートを使用します。

# firewall-cmd --get-services
... ms-wbt ...

現在のゾーンに「ms-wbt」サービスを追加します。

# firewall-cmd --zone=$ZONE --add-service=ms-wbt

ただし、これは Runtime に設定されただけなので、次回起動時には設定が無くなります。再起動後も有効になるよう Permanent にも設定します。

# firewall-cmd --permanent --zone=$ZONE --add-service=ms-wbt

現在のゾーンに「ms-wbt」サービスが追加されたことを確認します。

# firewall-cmd --list-services --zone=$ZONE
# firewall-cmd --permanent --list-services --zone=$ZONE

SELinux 設定のバグ対応

SELinux 設定のバグがあるようですのでこれに対応します。「/usr/sbin/xrdp」および「/usr/sbin/xrdp-sesman」の 2 つのファイルに関して SELinux コンテキストを変更します。

# chcon -t bin_t /usr/sbin/xrdp /usr/sbin/xrdp-sesman

参考)
https://bugzilla.redhat.com/show_bug.cgi?id=1177202

SELinux Polkit Rule の設定

wheel グループのユーザーでリモートデスクトップに接続した際、いくつか root パスワードを求められるので、これにスキップできるようにします。

# ls /etc/polkit-1/rules.d/
# cat << "EOF" > /etc/polkit-1/rules.d/99-xrdp-remote-desktop.rules
//
// wheel users can network proxy configure
//
polkit.addRule(function(action, subject) {
  if (action.id == "org.freedesktop.packagekit.system-network-proxy-configure" && subject.isInGroup("wheel")) {
      return polkit.Result.YES;
  }
});

//
// wheel users can execute xrandr (create a color managed device)
//
polkit.addRule(function(action, subject) {
  if (action.id == "org.freedesktop.color-manager.create-device" && subject.isInGroup("wheel")) {
      return polkit.Result.YES;
  }
});

//
// wheel users can execute system-sources-refresh
//
polkit.addRule(function(action, subject) {
  if (action.id == "org.freedesktop.packagekit.system-sources-refresh" && subject.active && subject.isInGroup("wheel")) {
      return polkit.Result.YES;
  }
});

//
// wheel users can execute 'systemctl restart xrdp'
//
polkit.addRule(function(action, subject) {
  if (action.id == "org.freedesktop.systemd1.manage-units" && subject.active && subject.isInGroup("wheel")) {
      return polkit.Result.YES;
  }
});

//
// wheel users can execute NetworkManager.settings.modify.system
//
polkit.addRule(function(action, subject) {
  if (action.id == "org.freedesktop.NetworkManager.settings.modify.system" && subject.isInGroup("wheel")) {
      return polkit.Result.YES;
  }
});
EOF

SELinux Policy の設定

ログイン時に毎回、ABRT によるエラーが報告されるのですが、つぎの SELinux の対応をすることで回避できます。semodule コマンドの実行には時間がかかる場合があります。

# dnf -y install selinux-policy-devel
# mkdir temp
# cd temp
# cat << "EOF" > mypol.te

module mypol 1.0;

require {
        type unconfined_service_t;
        type colord_t;
        class dir search;
        class file { read getattr open };
}

#============= colord_t ==============
allow colord_t unconfined_service_t:dir search;
allow colord_t unconfined_service_t:file { read getattr open };
EOF

# make -f /usr/share/selinux/devel/Makefile mypol.pp
# semodule -i mypol.pp
# cd ..
# rm -rf temp

この問題は以下に報告されているのですが、まだ解決されていないようです。
https://bugzilla.redhat.com/show_bug.cgi?id=1205022

リブートして接続確認

リブートした後、Windows PC から Remote Desktop を使って接続できることを確認してください。Linux から接続する場合は rdesktop、xfreerdp コマンドなどがあります。SELinux はリブートした後は有効になっているはずです。SELinux 関連の処理によりリブートには時間がかかる場合があります。

画面解像度の変更

XRDP によるリモートデスクトップ接続をおこなったとき、デフォルトでは画面の解像度がローカルPCの画面と同じになります。画面の解像度を変更したい場合は、つぎの手順でおこないます。

まずは、ログインしたユーザーアカウントでターミナルを開き、xrandr コマンドを使って接続されているモニターの名前(VNC-0)とサポートされている解像度を確認します。つぎに xrandr コマンドでそのモニター名と解像度を指定して変更します。

$ xrandr
Screen 0: minimum 32 x 32, current 1280 x 1024, maximum 32768 x 32768
VNC-0 connected primary 1280x1024+0+0 0mm x 0mm
   1920x1200     60.00  
   1920x1080     60.00  
   1600x1200     60.00  
   1680x1050     60.00  
   1400x1050     60.00  
   1360x768      60.00  
   1280x1024     60.00* 
   1280x960      60.00  
   1280x800      60.00  
   1280x720      60.00  
   1024x768      60.00  
   800x600       60.00  
   640x480       60.00  

$ xrandr --output VNC-0 --mode 1024x768

デフォルトの解像度の設定

Gnome の設定画面から画面の解像度を変更しても、その内容が保存されないようです。次回のログイン時に元の解像度に戻ってしまいます。ログインのたびに毎回、xrandr コマンドを入力して設定しなおすのは面倒です。これを回避するには、ログイン時に自動的に xrandr コマンドを実行することで可能です。

ユーザーの HOME ディレクトリ下の「.config/autostart/」ディレクトリに「*.desktop」ファイルを作成します。ここでは、「$HOME/.config/autostart/xrandr-setup.desktop」という名前で作成します。この例は解像度を 1024×768 に指定しています。利用状況に合わせて適切に変更してください。

$ mkdir -p $HOME/.config/autostart/

$ cat << "EOF" > $HOME/.config/autostart/xrandr-setup.desktop
[Desktop Entry]
Name=xrandr-setup
GenericName=xrandr-setup
Comment=Screen Resolution for Remote Desktop
Exec=/usr/bin/xrandr --output VNC-0 --mode 1024x768
Terminal=false
Type=Application
X-GNOME-Autostart-enabled=true
EOF

ログインできない時の対応

リモートデスクトップにログインできなくなったという場合は、ssh でログインして GDM の再起動を試してみてください。

# systemctl restart gdm

以上です。Fedora のリモートデスクトップをお楽しみください。