SELinux

一部のディストリビューション(Fedoraなど)では、SELinuxがデフォルトで有効になっており、RustDeskサービスが正常に開始・実行できなくなります。

ターミナルで sestatus を実行して、SELinuxが有効になっているかどうかを確認できます。

有効かどうかによって、以下のような2つの異なる出力が表示されます:

# 有効
SELinux status: enabled
...

# 無効
SELinux status: disabled
...

SELinuxポリシーの追加

SELinuxの紹介については、SELinux/Tutorialsを参照してください。

ここでは、Fedora 38を例にSELinuxポリシーを追加する方法を紹介します。

sudo dnf install selinux-policy-devel make

SELinuxポリシーを追加するには、プロセスのセキュリティコンテキストにあるサービスの種類を決定する必要があります。

$ ps -eZ | grep rustdesk
system_u:system_r:init_t:s0 80439 ? 00:00:02 rustdesk

system_u:system_r:init_t:s0 は RustDeskプロセスのセキュリティコンテキストで、3番目のフィールド init_t がプロセスの種類です。

SELinux型ルールを記述する方法は2つあります:

  1. デフォルトの init_t にルールを追加する。
  2. 新しい型 rustdesk_t を追加してルールを追加する。

最初の方法は比較的小さな変更ですが、デフォルトの init_t が変更されるため、init_t 型を使用する他のサービスに認可を追加することと同等です。使用は推奨されません。

2番目の方法は、ゼロからルールを追加することです。追加する必要があるルールが多く、異なるシステムでは違いがある可能性があります。実際の使用中にいくつかの調整が必要になる場合があります。

デフォルト型の使用

RustDeskサービスのデフォルト型は init_t で、これはSELinuxのコンテキスト継承ルールによって決定されます。

注意:デフォルト型を変更すると、他のサービスのポリシーも変更される可能性があります。この方法は慎重に使用してください!

ルールファイル rustdesk.te を編集します:

module rustdesk 1.0;

require {
        type event_device_t;
        type xserver_t;
        type xserver_port_t;
        type sudo_exec_t;
        type init_t;
        type ephemeral_port_t;
        type user_tmp_t;
        type user_fonts_cache_t;
        type pulseaudio_home_t;
        type session_dbusd_tmp_t;
        type unconfined_dbusd_t;
        class process execmem;
        class file { open read create write execute execute_no_trans map setattr lock link unlink };
        class unix_stream_socket connectto;
        class tcp_socket name_connect;
        class dir { add_name remove_name };
        class sock_file write;
        class chr_file { open read write } ;
}

#============= init_t ==============
allow init_t xserver_t:unix_stream_socket connectto;
allow init_t sudo_exec_t:file { open read execute execute_no_trans };
allow init_t user_tmp_t:file { open write setattr };
allow init_t self:process execmem;
allow init_t user_fonts_cache_t:dir { add_name remove_name };
allow init_t user_fonts_cache_t:file { read write create open link lock unlink };
allow init_t xserver_port_t:tcp_socket name_connect;
allow init_t pulseaudio_home_t:file { read write open lock };
allow init_t session_dbusd_tmp_t:sock_file write;
allow init_t unconfined_dbusd_t:unix_stream_socket connectto;

#!!!! This AVC can be allowed using the boolean 'nis_enabled'
allow init_t ephemeral_port_t:tcp_socket name_connect;

#!!!! This AVC can be allowed using the boolean 'domain_can_mmap_files'
allow init_t sudo_exec_t:file map;

#============= init_t Wayland ==============
allow init_t event_device_t:chr_file { open read write };

#!!!! This AVC can be allowed using the boolean 'domain_can_mmap_files'
allow init_t user_tmp_t:file map;

実行:

$ checkmodule -M -m -o rustdesk.mod rustdesk.te && semodule_package -o rustdesk.pp -m rustdesk.mod && sudo semodule -i rustdesk.pp
$ sudo semodule -l | grep rustdesk

rustdesk_t の作成

  1. 新しいディレクトリを作成:mkdir rustdesk-selinux-1.0
  2. SELinuxポリシーファイルを作成:touch Makefile rustdesk.te rustdesk.fc rustdesk.if
.
├── Makefile
├── rustdesk.fc
├── rustdesk.if
└── rustdesk.te

rustdesk.te はメインのポリシーファイルです。 この例では、このファイルは主に3つの部分から構成されています:

  1. GitHubのselinux-policyリポジトリのinit.te
  2. 監査ログ、grep rustdesk /var/log/audit/audit.log | audit2allow -a -M test
  3. テストシステムの init_t ポリシー、sesearch -A | grep 'allow init_t ' | sed 's/allow init_t /allow rustdesk_t /g'

一部のポリシーは重複しており、一部は冗長ですが、rustdesk_t で動作するため問題ありません。

SELinuxポリシーファイルの複雑さと詳細な技術的内容のため、簡潔性のため完全な技術設定内容はここでは省略されています。完全な設定については英語版を参照してください。

SELinuxポリシーの自動生成(sepolicy)

$ # 依存関係をインストール
$ sudo dnf install -y rpm rpm-build binutils
$ # ポリシーを生成
$ sepolicy generate --init /usr/lib/rustdesk/rustdesk
$ tree
.
├── rustdesk.fc
├── rustdesk.if
├── rustdesk_selinux.spec
├── rustdesk.sh
└── rustdesk.te
$ # rustdesk.teを編集
$
$
$ # rpmパッケージrustdesk_selinux-1.0-1.fc38.src.rpmを生成
$ sudo ./rustdesk.sh
$ # パッケージをインストール
$ sudo dnf install -y rustdesk_selinux-1.0-1.fc38.src.rpm
$ # サービスを再起動
$ sudo systemctl restart rustdesk

反復的なポリシーの追加

$ cd /tmp
$ grep rustdesk_t /var/log/audit/audit.log | audit2allow -a -M rustdesk_tmp
$ cd <rustdesk-selinux-1.0>
$ # rustdesk_tmp.teをrustdesk.teにマージ
$ make clean && make && sudo make install-policy

参考文献