ノートPCを買ってUbuntuを入れたのはいいけれど、2台持ちはやはりきつい。というわけで、デスクトップPCとノートPCでRDPすることにした。
ついでにAndroidのMicrosoft Remote Desktopでもログインできるようにしたいな。外出先から自宅のUbuntuにログインできるとか素敵じゃない?何に使うか知らんけど。
UbuntuのクライアントはRemmina、AndroidのクライアントはMicrosoft Remote Desktop。Ubuntu側のRDPサーバはxrdpを使用。
ちなみにWindows同様、xrdpは1つのOSに対して一人しかログインできません。2人目以降は真っ暗になったりログイン直後に強制的に追い出されたりします。
xrdpの準備
インストール
まずノートPC(ログインされる側)にxrdpをインストールします。
# sudo apt install xrdp
こんだけ。ほんと楽。
自動でxrdpというユーザーが作られます。
設定
構成は以下のとおりです。
今回はLinux to Linuxで環境を作ったので、接続元のクライアントはRemminaを使用しました。Remminaから接続できればMicrosoft Remote Desktopからも利用できます。

Ubuntuの設定1 - usermod
ノートPC側でxrdpユーザーをssl-certグループに入れる。
$ sudo usermod -aG ssl-cert xrdp
xrdpをインストールするとxrdpというユーザーが作られ、xrdpユーザーがxrdpプロセスを起動する。
リモートからRDPの要求があるとxrdpプロセスは/etc/xrdp/cert.pemや/etc/xrdp/key.pemを読もうとする。が、失敗してrdpのセッションが異常終了する。(ちなみにpemは証明書だったり暗号化キーだったりする。)
理由は/etc/xrdp/*.pemの実体が/etc/ssl/certs/ssl-cert-snakeoil.pemや/etc/ssl/private/ssl-cert-snakeoil.keyであり、これらの権限が以下だから。
-rw-r----- 1 root ssl-cert
解決策としてはpemの実体ファイルにユーザー権限をつけるかxrdpをssl-certグループに入れるかの2つ。ファイルの権限を変更すると他のプロセスからも自由に読めてしまうので、プロセス側に権限をつける方が正しい。
というわけで上記のコマンドの通りxrdpをssl-certグループに入れている。
X Windows Systemの設定1 - Xwrapper
$ sudo cp -p /etc/X11/Xwrapper.config /etc/X11/Xwrapper.config.org $ sudo vi /etc/X11/Xwrapper.config 編集 $ diff /etc/X11/Xwrapper.config /etc/X11/Xwrapper.config.org 15,17c15 < #allowed_users=console ←コメントアウト < allowed_users=anybody ←上記をコピーして変更 < needs_root_rights=no ←追加 --- > allowed_users=console ←変更前
xrdpはX Window Systemを使っているので、X Window System側の設定も必要になる。
デフォルトではコンソール(つまり対面のキーボード+ディスプレイ)からしか接続を許可していないので、allowed_users=anybodyを追加してリモートからの接続を許可している。
また、リモートからの接続はデフォルトではrootユーザだけなので、need_root_rights=noを設定してroot以外のユーザーでも利用できるようにしている。
X Window Systemの設定2 - xsession
.xsessionrcに以下を記載する
$ vi ~/.xsessionrc (以下を記載) export GNOME_SHELL_SESSION_MODE=ubuntu export XDG_CURRENT_DESKTOP=ubuntu:GNOME export XDG_DATA_DIRS=/usr/share/ubuntu:/usr/local/share:/usr/share:/var/lib/snapd/desktop export XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
xrdpのセッションが開始すると、デスクトップの描画が始まる。その際、デスクトップの見た目をどのようにするか等を決めておく必要がある。
X Windows Systemではそれらの設定を~/.xsessionrcに記載することができる。Ubuntuの場合、上記のように記載しておけば問題ない。
xrdpを再起動
設定を反映させるためxrdpを再起動する。
$ sudo systemctl restart xrdp
Uubntuの設定2 -PolKit
PolKitというのはsudoの様な権限をスイッチしたり制限するための機能でUbuntuでは8.04から使われています。
sudoはまるっとrootの特権を与えて使えるコマンドを制限するのに対し、Polkitはroot権限までは与えないとか、操作ごとに細かい制限ができます。
この設定を変更せずにリモートからログインすると
- ログインキーリングのパスワードを入力してください
- カラープロフィアルを作成するには認証が必要です
- カラーマネージメントされたデバイスを作成するには認証が必要です
- Authentication is required to refresh the system repositories
という認証が4回も出てうんざりします。
というわけでこの4つの認証のうちログインキーリング以外のメッセージを非表示にします。ログインキーリングはパスワードに更にパスワードを懸ける仕組みで、シャドウパスワードの様なものです。複数のパスワードを一つのキーリングで保護できます。
$ sudo bash # cd /etc/polkit-1/localauthority/50-local.d # vi 45-allow-colord.pkla (編集) # cat 45-allow-colord.pkla [Allow Colord all Users] Identity=unix-user:* Action=org.freedesktop.color-manager.create-device;org.freedesktop.color-manager.create-profile;org.freedesktop.color-manager.delete-device;org.freedesktop.color-manager.delete-profile;org.freedesktop.color-manager.modify-device;org.freedesktop.color-manager.modify-profile ResultAny=no ResultInactive=no ResultActive=yes [Allow Package Management all Users] Identity=unix-user:* Action=org.debian.apt.*;io.snapcraft.*;org.freedesktop.packagekit.*;com.ubuntu.update-notifier.* ResultAny=no ResultInactive=no ResultActive=yes
これで一旦ログオフして再度RDPで接続すれば認証は聞かれないはず。
最初にsudo bashしているのは、/etc/polkit-1/localauthorityディレクトリがroot権限がないと入れないためです。
sudo cd /etc/polkit-1/localauthority ではダメです。cdというコマンドが無くなったので。(cd はbashの関数になりました。)
以降の設定を理解するにはPolkitの動作を知っておく必要があるので少し説明します。
PolkitはActionとruleという2つの世界で動作を制御します。Actionは「カラープロファイルを作成するにはどの権限が必要」というルールで、roleはそのルールを上書きするルールです。
これらは/usr/share/polkit-1に保存されていますが、基本的に変更してはいけません。
カスタマイズする場合は /etc/polkit-1/localauthority/50-local.d/に.pklaという拡張子でファイルを作ります。ファイル名は任意ですが、lsでソートした際に下に行くほど優先順位が高く(上書き)なります。
pkaction --version で0.106未満のバージョンではpkla、0.106以降であれば.confファイルを作成するようです。書式は全然違います。
http://c-nergy.be/blog/?p=13641
記載するのは以下の5行です
- Identity … unix-user:* で固定
- Action = 制御したいアクション
- ResultAny = アクティブ、非アクティブの許可
- ResultInactive = アクティブでないセッション(リモート接続)の許可
- ResultActive=アクティブなセッション(ローカル接続)の許可
Actinは/usr/share/polkit-1/actions/の下にあるファイルの中でaction idで設定差入れている動作を";"区切りで指定します。 grep "action id" * policyで見れるはず。
ResultXXXはアクションに関する権限で、no(権限を与えない)、yes(権限を与える)等の設定ができます。基本的にResultAnyはnoにしておき、ResultInactiveでリモート接続、ResultActiveでローカル設定の権限を設定します。通常はResultInactive=no、ResultActiveはyesにします。その他の設定はこちらを参照。
まとめ
今回はRDPでしたが、Linux系OSは端末間の連携が非常に得意です。
AirdroidでAndroidスマートフォンを操作できるのは有名ですが、KDEConnectと使うとスマートフォンに届いたSMS/LINEにデスクトップから応答できたり、スマートフォン間でファイル共有や音楽プレイヤーの操作ができます。
いちいちスマートフォンを取りに行く煩わしさがなくなり手放せなくなるでしょう。
一方でセキュリティには注意が必要です。安易にrootの権限を与えてしまうのは危険なので、今回使用したpolkitやxwrapperでユーザーを絞り込むなど工夫してみてください。