実践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)へ

目 次
HOME
 全体のシステム構成&目次


RockyLinux

RockyLinux8.4のインストール

旧サーバーからのデータ移行

ネットワークの設定ほか
ダイレクトルールを使ったfirewallの強化
DNS(BIND)サーバー
DHCPサーバー
FTPサーバー
FTPS(FTP over SSL/TLS)
Webサーバー
  アクセス解析ツールAwstats
Mail(Dovecot&Postfix)サーバー
MariaDB(MySQL)サーバー
SSHサーバー
SSHトンネル
SSH+MariaDB+Exel
Sambaサーバー
openVPNサーバー
VNCサーバー(リモートディスクトップ)

systemdとfirewalldについて


CentOS8
CentOS7
CentOS5〜6

SELinux

Cプログラミング


●その他
クラウド Amazon EC2
Raspberry Piで遊ぶ
印刷機関連開発
 刷版絵柄面積率測定
 Indesign上にPDF自動配置
数独をExcelで解く


●趣味の世界
相対性理論
量子力学
群論
熱力学・統計力学
解析力学
物理でつかう数学
超弦理論(ノート作成中)


ブログサイトはこちらより