実践Linux
RockyLinux8 RockyLinux8 目次へ TOP(HOME)へ
VNCサーバー(リモートデスクトップ tigervnc-server1.11.0-6) 2021年9月更新
●インストール
インストール(tigervncやtigervnc-server-minimalなどはあるが、tigervnc-serverはないのでインストール)
インストール状況の確認
# dnf list installed | grep vnc
インストール
# dnf list | grep tigervnc
# dnf install tigervnc-server
tigervnc-serverとtigervnc-selinuxがインストールされる。
●パスワードの設定(VNCサービスの起動する前にやっておく。)
ここではrootとLinuxユーザーfoo01のためのパスワードを設定
まず、rootから
# vncpasswd
おなじみ2回入力。
つづけて、見るだけのパスワードも設定するかときかれるので「no」
/root/.vnc/passwdができる。
foo01も同様に
# sudo -u foo01 vncpasswd ← sudo -u foo01はfoo01としてvncpasswdを実行
おなじみ2回入力。
つづけて、見るだけのパスワードも設定するかときかれるので「no」
/home/foo01/.vnc/passwdができる。
●設定
起動ファイルの準備
/usr/lib/systemd/system/vncserver@.serviceを/etc/systemd/system/にvncserver@:2.service名、vncserver@:3.service名でコピー。
この:2等がディスプレイ番号となる。ディスプレイ番号は1番以降を指定する。0番はダメ(本体PCで使用のX Windowと関連しているので)。
# cp -a /usr/lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:2.service
# cp -a /usr/lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:3.service
selinuxタイプの整合性を修正しておく
# restorecon -F /etc/systemd/system/vncserver@:2.service
# restorecon -F /etc/systemd/system/vncserver@:3.service
以下、/usr/share/doc/tigervnc/HOWTO.md参照
/etc/tigervnc/vncserver.usersの編集(割り当てを指定)
:2=root
:3=foo01
/etc/tigervnc/vncserver-config-defaultsを/root/.vnc/と/home/foo01/.vnc/にコピーして、名称をconfigに直しておく。
/root/.vnc/configの編集
session=gnome
#securitytypes=vncauth,tlsvnc
#desktop=sandbox
geometry=1680x1050
localhost ssh接続のみに制限して安全性を高める(セキュアトンネルを利用してないものを禁止)
#alwaysshared
/home/foo01/.vnc/configの編集
session=gnome
#securitytypes=vncauth,tlsvnc
#desktop=sandbox
geometry=1680x1050
#localhost
#alwaysshared
selinuxタイプの整合性を修正しておく
# restorecon -RFv /home/user01/.vnc
# restorecon -RFv /root/.vnc
ポートは5900+ディスプレイ番号/TCPが使用される。ここでは5902/TCPと5903/TCP。
●VNCサービスを起動
# systemctl start vncserver@:3.service
起動すると、サーバー側では、foo01のデスクトップ画面にはログインできなくなる。
vncserver@:2.serviceについては後述
●firewalldの設定
trustedゾーン(内部LAN側にはすでにZONE=trustedが設定済み)に対しては、必要ない。
外部からは、基本的にSSHトンネルを利用する。
VNCクライアント(Windows)
Windows用vncクライアントソフトとして「realVNC」を利用する
「realVNC」はさまざまなOS用のVNCサーバー、クライアントを提供している。
「realVNC」の本家=http://www.realvnc.com/のものは、Vista以降はフリーのものが用意されていない。
そこで、http://www.vector.co.jp/vpack/filearea/win/net/network/より、改良されたフリーの「RealVNC日本語インストール版 4.1.2」をダウンロードして利用するとよい。インストール画面でサーバー、ビューワ等のどちらでも選択ができる。
foo01への接続(rootへの接続は後述)
ローカルネットワーク接続の場合は、 192.168.7.1:3(192.168.7.1:5903)等
SSH接続は、SSHトンネルを参照。
ログインした時、「カラープロファイルを作成するには認証が必要です」となる。
このダイアログを消す方法
既に/etc/polkit-1/localauthority.conf.d/02-allow-colord.confに設定している場合にはそれを削除し、
/etc/polkit-1/localauthority/50-local.d/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
設定したら polkit.service を再起動する。
# systemctl restart polkit.service
user01のデスクトップ画面へのアクセスでは、さらに、管理者の認証がでるので、rootのパスワードが必要。
再度要求されたときは、「キャンセル」でOK。
rootのデスクトップ画面にアクセスする方法
問題はrootのvncserver@:2.serviceである。rootのデスクトップ画面からは当然起動することはできない。なぜなら起動とデスクトップ画面へのログインは両立しないからである。
# systemctl start vncserver@:2のあと、# systemctl status vncserver@:2でみると、activeにはならずinactiveになっていることがわかる。
そこでいったんrootのデスクトップ画面からログアウトして、試しに他のユーザーfoo01から$ su -でrootになり、起動してみることにする。
selinuxを無効にして試してみる。すると、起動ができて(activeになっている)、クライアントからも接続できるようになる。ただし、selinuxが有効だと起動できない。
$ su -
# setenforce 0
# systemctl start vncserver@:2
# setenforce 1 起動できたら有効にしてかまわない
使い終わったら、必ず停止
# systemctl stop vncserver@:2
となると、SSHクライアント(putty)でrootにSSH接続してターミナルを開き、ここから起動・停止するのがよさそうだ。これならwindowsからも起動できて、このSSHトンネルを使ったVNCアクセスもできる。(最後は停止するのをわすれないように。そうでないとサーバー側で、rootのデスクトップ画面にログインできなくなる。)
──────────────────────────────────────────
あとは、selinuxを解決すればよい。
そういえば、tigervnc-serverをインストールしたときtigervnc-selinuxもインストールされていたが、これは/root/.vncまではカバーしていないようだ。/usr/share/selinux/packages/vncsession.ppがそのモジュール・パッケージらしい。
仕方ないので、おなじみaudit2allowを使って解決策を探ってみることにする。
これには、SSH接続でrootのターミナルを開いて作業する。
permissiveモードにする # setenforce 0
この状態で起動を試し、auditのログをとる。
# systemctl start vncserver@:2
ログが溜まりすぎている場合は、/var/log/audit/audit.logをいったん削除して、auditdサービスを再起動しておく(再起動は、#
service auditd restart)。audit.logが刷新されるので、それからログをとるとよい。
ログをとり終わったら、元にもどしておく。
# setenforce 1
# systemctl stop vncserver@:2
ここからは、サーバーのrootのデスクトップ画面で作業するのがやりやすいだろう。
次を実行して、上で記録したログを解析する。
# audit2allow -a -l -m local
出力の重要な部分は、次の箇所とおもわれる。
module local 1.0;
require {
type admin_home_t;
type vnc_session_t;
class file { create open write };
}
#============= vnc_session_t ==============
allow vnc_session_t admin_home_t:file { create open write };
さてここから作業にはいる。
以下、local-vncの名称で一貫させるが、別の名称で一貫してもよい。
ここからは、「selinux作業用」ディレクトリを作って、ここで作業する。
上のコマンドの場合は、結果を表示するだけで.teファイル等は作成されない。
local-vnc.teを作成するには、# audit2allow -m local-vnc -l -i /var/log/audit/audit.log > local-vnc.te
作成されたlocal-vnc.teの必要な部分だけとりだして編集する。
module local-vnc 1.0;
require {
type vnc_session_t;
type admin_home_t;
class file { create open write };
}
#============= vnc_session_t ==============
allow vnc_session_t admin_home_t:file { create open write };
これをモジュール・パッケージの形式(.ppファイル)に変換する。
@そのためには、checkpolicyパッケージが必要。
# dnf list installed | grep checkpolicy でインストールされているか調査。
インストール済み。インストールされていなければ # dnf install checkpolicy
Aselinux-policy-develのインストール(Makefileを使うときは必要。)
# dnf list installed | grep selinux でインストールされているか調査。
# dnf install selinux-policy-devel インストール
Makefileを使うので、作業用ディレクトリに、 /usr/share/selinux/devel/Makefileをコピーしておく。
local-vnc.teをモジュール・パッケージlocal-vnc.ppに変換
# make モジュール・パッケージlocal-vnc.ppが生成される。
モジュール・パッケージのインストール
# semodule -i local-vnc.pp
ポリシー・モジュールの表示
# semodule -l | grep vnc インストールされたか否か確認。local-vncが表示されたらOK。(先にみたvncsessionも表示されている。)
ポリシー・モジュールを削除するには,
# semodule -r local-vnc
以上で、selinuxも解決したはず。多少安易な気もするが。
使用方法(windows)まとめ
@SSHクライアント(putty)でrootにSSH接続する。rootターミナルが開く。
A起動
rootのデスクトップ画面にアクセスするとき # systemctl start vncserver@:2
foo01のデスクトップ画面にアクセスするとき # systemctl start vncserver@:3
BVNCクライアントを開いて、Aに従ってそれぞれ
root画面 localhost:1234 ←1234等はSSHクライアント(putty)の設定による
foo01画面 localhost:1238(あるいは、192.168.7.1:3)
使い終わったら、必ず次のCを実行しておく。
C停止 rootターミナルより、# systemctl stop vncserver@:2(あるいは、# systemctl stop vncserver@:3)
Drootターミナル終了
TOP(HOME)へ