TigerVNC를 사용하여 Linux에서 VNC 서버를 구성하고 보호하는 방법은 무엇입니까?(화면이 없는 서버 또는 클래식 머신에서)
VNC 서버(TigerVNC) 구성은 대부분의 Linux 배포판에서 동일하므로 설치 방법만 다릅니다. 이 질문은 OpenSUSE, Fedora, CentOS, RHEL, Debian, Mageia, Void Linux, Arch Linux, Manjaro 및 FreeBSD( 더 많은 분들에게 도움이 되도록)
답변1
VNC 서버 설치
Linux(클래식 시스템 또는 화면 없는 서버)에는 TightVNC, TigerVNC 및 TurboVNC와 같은 VNC 서버에 대한 여러 가지(오픈 소스) 가능성이 있습니다(이것은 전체 목록이 아니며 이 가이드에서는 TigerVNC의 기본 버전을 사용합니다).
- TigerVNC 서버: 네이티브 또는 Java 코드를 사용하며 적극적으로 유지 관리됩니다.
- TurboVNC 서버: Java 전용, 적극적으로 유지 관리됩니다.
- TighVNC 서버: 2020년 현재 Linux 버전은 2009년 v1.3.10입니다.
먼저 데스크탑(예: XFCE 또는 KDE)이 필요합니다.
# OpenSUSE (XFCE)
zypper in -t pattern xfce
# OpenSUSE (KDE)
zypper install -t pattern kde kde_plasma
# Fedora/OpenSUSE (XFCE)
dnf groupinstall -y "Xfce Desktop"
# Fedora/OpenSUSE (KDE)
dnf -y group install "KDE Plasma Workspaces"
# CentOS/RHEL (Gnome)
dnf -y group install "Server with GUI"
# CentOS/RHEL (XFCE)
dnf --enablerepo=epel group -y install "Xfce" "base-x"
# CentOS/RHEL (KDE)
dnf --enablerepo=epel group -y install "KDE Plasma Workspaces"
# CentOS v8 (KDE)
dnf --enablerepo=epel,PowerTools
dnf -y group install "KDE Plasma Workspaces" "base-x"
# Debian (XFCE)
apt install task-xfce-desktop
# Debian (KDE)
apt install task-kde-desktop
# Mageia (XFCE)
dnf install task-xfce
# Mageia (KDE)
dnf install task-plasma5
# FreeBSD (XFCE)
pkg install xfce
# FreeBSD (KDE)
pkg install x11/kde5
# Void Linux (XFCE)
xbps-install -S xfce4
# Void Linux (KDE)
xbps-install -S kde5
# and optionally, kde5-baseapps
# Arch Linux (XFCE)
pacman -S xfce4 xfce4-goodies
# Arch Linux (KDE)
pacman -S plasma-desktop
# or plasma for the full desktop
# pacman -S plasma
# Manjaro (XFCE)
pacman -S xfce4-gtk3 xfce4-goodies xfce4-terminal \
network-manager-applet xfce4-notifyd-gtk3 \
xfce4-whiskermenu-plugin-gtk3 tumbler engrampa
# Manjaro (KDE)
pacman -S plasma kio-extras
# optional kde-applications
TigerVNC X 서버를 설치합니다:
# The package name may change depending on the used distro
# CentOS
yum install tigervnc-server
# Mageia/Fedora/CentOS/RHEL
dnf install tigervnc-server
# ALT Linux
apt install tigervnc-server
# openSUSE DNF
dnf install xorg-x11-Xvnc
# openSUSE
zypper install xorg-x11-Xvnc
# Debian
apt install tigervnc-standalone-server tigervnc-common
# FreeBSD
pkg install tigervnc-server
# Void Linux
xbps-install -S tigervnc
# Arch Linux
pacman -S tigervnc
# Manjaro
pacman -S tigervnc
설정 및 구성
비밀번호 설정(해시된 버전은 에 저장됨 ~/.vnc/passwd
):
vncpasswd
구성 파일(서버가 시작될 때 실행되는 시작 스크립트)을 ~/.vnc/xstartup
다음과 같이 편집합니다.
#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
exec startxfce4
# XFCE: startxfce4 or xfce4-session
#exec startxfce4
#exec xfce4-session
# KDE: startkde or startplasma-x11
#exec startkde
#exec startplasma-x11
# Gnome: startx
#exec startx
VNC 서버의 구성 파일을 준비 및/또는 찾습니다.
~/.vnc/config or /etc/vnc/config
구성 파일을 사용하여 VNC 서버의 설정을 조정합니다... 사용할 수 있는 사용 가능한 옵션의 전체 목록을 보려면 Xvnc -help
다음 man Xvnc
구성 예를 참조하세요.geometry
(또한 Suse VNC와 같은 일부 시스템에서는 이 옵션이 설정되지 않으면 작동하지 않을 수도 있습니다.):
## Supported server options to pass to vncserver upon invocation can be listed
## in this file. See the following manpages for more: vncserver(1) Xvnc(1).
## Several common ones are shown below. Uncomment and modify to your liking.
##
##
# -------------
# Xvnc --help
# -------------
##
# Start server : vncserver
# Stop server : vncserver -kill :1
##
###############################################################################
# Only allow connection from local hosts
#localhost
# VNC tcp port
rfbport=5900
# TCP port to listen for HTTP (default=0)
httpport=0
# Directory containing files to serve via HTTP (default=)
httpd=
# Protocols...
#nolisten=UDP
#listen=TCP
# IP settings
useipv4
#useipv6
# Interface, listen on the specified network address (default=all)
#interface=127.0.0.1
# Use protocol version 3.3 for backwards compatibility
protocol3.3=0
# Unix socket access mode (default=384)
#rfbunixmode=384
# Unix socket to listen for RFB protocol (default=)
rfbunixpath=
# Name of VNC desktop
desktop=MyVNC
# Geometry original peppy
geometry=1366x768
# Colors
depth=24
# Sharing with multiple clients
#alwaysshared
nevershared
# Disconnect existing clients if an incoming connection is non-shared.
# If combined with NeverShared then new connections will be refused while
# there is a client active
disconnectclients
# Security, specify which security scheme to use (None, VncAuth, Plain,
# TLSNone, TLSVnc, TLSPlain, X509None, X509Vnc, X509Plain) (default=TLSVnc,VncAuth)
securitytypes=TLSVnc,VncAuth
# Path to the key of the X509 certificate in PEM format (default=)
#X509Key=
# Path to the X509 certificate in PEM format (default=)
#X509Cert=
# Set maximum number of clients (power of two)
#maxclients=64
# Terminate after s seconds of user inactivity (default=0)
#maxidletime=0
# Terminate when a client has been connected for s seconds (default0)
#maxconnectiontime=0
# Terminate when no client has been connected for s seconds (default=0)
#maxdisconnectiontime=0
# The number of seconds after which an idle VNC connection will be dropped
# (zero means no timeout) (default=0)
#idletimeout=0
# Zlib compression level (default=-1)
#zlibLevel=-1
# The maximum number of updates per second sent to each client (default=60)
#framerate=60
# GnuTLS priority string that controls the TLS session’s handshake algorithms.
# See the GnuTLS manual for possible values. Default is NORMAL.
#GnuTLSPriority=
VNC 서버는 다음 명령을 사용하여 시작/중지할 수 있으며, VNC 클라이언트를 사용하여 서버에 연결할 수 있습니다.server-ip:used-port
(방화벽에서 사용되는 포트를 열어야 할 수도 있습니다.)
# Start the server
vncserver
# Stop the server :1
vncserver -kill :1
# Forcing multiple server to stop
killall Xvnc
안전
기본 VNC 설정은 교환된 스트림에 암호화를 사용하지 않습니다. VNC 연결을 보호하는 4가지 일반적인 방법은 다음과 같습니다.
X509 인증서 사용:인증서 위치를 구성 파일에 추가해야 하며 클라이언트에서도 인증해야 합니다(클라이언트 애플리케이션에서 위치 설정). X509 인증서 생성에 대해서는 아래에서 자세히 설명합니다.
SSH 세션을 통해 VNC 터널 설정SSH 세션에서 제공하는 로컬 sock 프록시를 사용하십시오. 서버에서 편집
/etc/ssh/sshd_config
및 활성화/추가한AllowTcpForwarding yes
후 sshd 서비스를 다시 시작한 후 다음 옵션을systemctl restart sshd.service
사용할 수 있습니다 .vncviewer
-via
또는터널 연결을 수동으로 설정한 후 클라이언트를 사용하여 연결: 그런 다음
ssh serverIP -p 22 -i /home/my/private/key -L 5900:127.0.0.1:5900 -C -N
VNC 클라이언트를 사용하여 연결합니다.127.0.0.1:5900
서버에서 vncviewer를 실행하고 클라이언트에 해당 x 창을 표시합니다.SSH X를 통해 세션 전달: 서버에서 편집
/etc/ssh/sshd_config
및 활성화/추가한X11Forwarding yes
다음 sshd 서비스를 다시 시작합니다systemctl restart sshd.service
.
SSH 세션(서버의 SSH 셸)을 통해 실행하면vncviewer :1
클라이언트에 vncviewer 창이 표시됩니다.VPN 연결을 통해 VNC 터널을 설정합니다.이 내용은 여기서 다루지 않습니다.
시스템 서비스로서의 VNC
VNC 서버는 다음 구성 파일을 통해 Systemd용 서비스로 사용될 수 있습니다 /etc/systemd/system/vncserver.service
. 서비스를 활성화하면 systemctl enable vncserver.service
시스템 시작 시 자동으로 시작됩니다(Void Linux 또는 Systemd가 없는 Linux 배포판에는 적용되지 않음).
# /etc/systemd/system/vncserver.service
[Unit]
Description=TigerVNC Server
After=syslog.target network.target
[Service]
Type=simple
#Type=forking
User=MY-USER
Group=MY-USER-GROUP
#If ran with root
#WorkingDirectory=/root
#PIDFile=/root/.vnc/%H%i.pid
#If ran with any other user
WorkingDirectory=/home/MY-USER
PIDFile=/home/%u/.vnc/%H%i.pid
#Environment is required when using a custom GnuTLS version
#Environment=LD_LIBRARY_PATH=/usr/local/lib64:/usr/local/lib:/usr/lib
ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1
#ExecStart for forking type version
#ExecStart=/usr/bin/vncserver
ExecStart=/usr/bin/vncserver -fg
ExecStop=/usr/bin/vncserver -kill :%i
[Install]
WantedBy=multi-user.target
X509 인증서 생성
간단한 보안 설정을 위해 다음과 같이 하세요.공식 위키따라갈 수 있습니다. 그렇지 않으면 이것은 쉬운 주제가 아닙니다. 이러한 유형의 암호화에 대해 자세히 알아보려면 이 섹션의 설명서/링크를 참조하십시오. 간단히 말해서 문서/링크에 따르면 2020년 현재 대부분의 보안 키는 키 크기가 큰(최소 4096비트) RSA이며EdDSAEd25519 구현은 SHA-512(SHA-2) 및 Curve25519(128비트 보안을 제공하는 타원 곡선)를 사용하는 EdDSA 서명 체계입니다. Ed25519 저항기는 3072비트 키가 있는 RSA와 동일합니다. (또는 SHAKE256(SHA-3) 및 Curve448을 사용하는 EdDSA 서명 체계인 EdDSA의 ED448이 있습니다. 이는 ~12448비트 키를 사용하는 RSA와 동일하며 업데이트된 OpenSSL 설치가 필요합니다.)
CA용 RSA-4096-Bits/Ed25519/ED448 개인 키를 생성합니다.
Ed25519 및 ED448의 경우 최신 버전의 OpenSSL 및 GnuTLS가 필요합니다(다음 섹션 참조).
mkdir ~/.vnc/ssl
# Generate an RSA 4096-bits key
openssl genrsa -out ~/.vnc/ssl/ca.private.rsa.4096.key.pem 4096
#
# genrsa is superseded by genpkey (PKCS#1 vs PKCS#8 format), the following command is similar to the previous one.
# openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -out ~/.vnc/ssl/ca.private.rsa.4096.key.pem
# Or an ED25519 key (equivalent to an RSA with a 3072-bits key, updated openssl required)
openssl genpkey -algorithm ED25519 -out ~/.vnc/ssl/ca.private.eddsa.ed25519.key.pem
# Or an ED448 key (equivalent to an RSA with a ~12448-bits key, updated openssl required)
openssl genpkey -algorithm ED448 -out ~/.vnc/ssl/ca.private.eddsa.ed448.key.pem
이전 단계는 비밀번호로 키를 보호하여 보다 안전한 방법으로 수행할 수 있지만 TigerVNC는 이를 지원하지 않습니다.
새로 생성된 키 확인/보기(필수 아님):
openssl pkey -in ~/.vnc/ssl/ca.private.rsa.4096.key.pem -text
# or
openssl pkey -in ~/.vnc/ssl/ca.private.eddsa.ed25519.key.pem -text
# or
openssl pkey -in ~/.vnc/ssl/ca.private.eddsa.ed448.key.pem -text
서명 CA를 생성하고 2년 동안 유효하게 만든 다음 서버 IP를 추가합니다(필수, 88.44.88.33
IP로 변경).
# RSA 4096-bits
openssl req -new -x509 -days 730 -key ~/.vnc/ssl/ca.private.rsa.4096.key.pem -out ~/.vnc/ssl/ca.sign.rsa.4096.key.pem -subj '/CN=88.44.88.33' -addext "subjectAltName=IP:88.44.88.33"
#Or ED25519
openssl req -new -x509 -days 730 -key ~/.vnc/ssl/ca.private.eddsa.ed448.key.pem -out ~/.vnc/ssl/ca.sign.eddsa.ed448.key.pem -subj '/CN=88.44.88.33' -addext "subjectAltName=IP:88.44.88.33"
# Or ED448
openssl req -new -x509 -days 730 -key ~/.vnc/ssl/ca.private.eddsa.ed448.key.pem -out ~/.vnc/ssl/ca.sign.eddsa.ed448.key.pem -subj '/CN=88.44.88.33' -addext "subjectAltName=IP:88.44.88.33"
X509를 사용하도록 서버 구성을 업데이트합니다.
# Security, specify which security scheme to use (None, VncAuth, Plain,
# TLSNone, TLSVnc, TLSPlain, X509None, X509Vnc, X509Plain) (default=TLSVnc,VncAuth)
securitytypes=X509Vnc
# Path to the key of the X509 certificate in PEM format (default=)
X509Key=/home/USER/.vnc/ssl/ca.private.eddsa.ed448.key.pem
# Path to the X509 certificate in PEM format (default=)
X509Cert=/home/USER/.vnc/ssl/ca.sign.eddsa.ed448.key.pem
TigerVNC 뷰어와 연결:
ca.sign.eddsa.ed448.key.pem
클라이언트에 복사- TigerVNC 뷰어의 옵션 > 보안에 있는 암호화 섹션에서
TLS with X509 certificates
이를 선택한 채로 두고 경로를ca.sign.eddsa.ed448.key.pem
켜기 로 설정합니다Path to X509 CA certificate
(CRL 섹션을 비워 둡니다). - 인증 섹션에서 다음만 선택하세요.
Standard VNC
GnuTLS 세션의 핸드셰이크 알고리즘 확인
TigerVNC는 암호화를 위해 GnuTLS를 사용하고 서버/클라이언트에서 TLS 세션 핸드셰이크 알고리즘을 제어하는 우선순위 문자열을 설정합니다 GnuTLSPriority
(TLS1.0/TLS1.1/TLS1.2/TLS1.3/etc. 지원 알고리즘 나열 가능).gnutls-cli --list
예를 들어 다음 명령을 사용하여 TLS v1.2 지원을 테스트할 수 있습니다.
vncviewer GnuTLSPriority=NORMAL:-VERS-ALL:+VERS-TLS1.2 -log='*:stdout:100'
서버 구성 파일에 TLS v1.2/v1.3을 적용하는 방법은 다음과 같습니다.
# GnuTLS priority string that controls the TLS session’s handshake algorithms.
# See the GnuTLS manual for possible values. Default is NORMAL.
# Only TLS v1.2
#GnuTLSPriority=NORMAL:-VERS-ALL:+VERS-TLS1.2
# Only TLS v1.3
GnuTLSPriority=NORMAL:-VERS-ALL:+VERS-TLS1.3
# Verifying if only TLS v1.2/v1.3 policy is working with the following
# vncviewer GnuTLSPriority=NORMAL:-VERS-TLS1.2 -log='*:stdout:100' # v1.2
# vncviewer GnuTLSPriority=NORMAL:-VERS-TLS1.3 -log='*:stdout:100' # v1.3
# This mean use all but v1.2/v1.3 to test if the setting is enforced correctly,
# and thus the connection will be refused for handshake algorithm mismatch.
# Other example of gnutlspriority values (warning, this is just for the syntax)
#GnuTLSPriority=NORMAL:-VERS-SSL3.0:-VERS-TLS1.0:-VERS-TLS1.1:-VERS-TLS1.3
#NORMAL:+SECURE128:-SHA384:-SHA256:-VERS-SSL3.0:-VERS-TLS1.0:-VERS-TLS1.1
#NORMAL:+VERS-TLS1.2:+VERS-TLS1.3:+AES-128-CBC:+RSA:+SHA1:+COMP-NULL
OpenSSL 및 GnuTLS 업데이트
OpenSSL과 GnuTLS는 대부분의 Linux 시스템의 두 가지 주요 응용 프로그램/라이브러리입니다. 수동으로 업데이트하면 더 이상 자동으로 업데이트되지 않으므로 보안 문제가 발생할 수 있습니다. 이 측면을 제한하기 위해 특별히 목적에 맞게 사용자 정의 버전(TigerVNC)을 사용하여 이를 수행할 수 있습니다. 효과.
vncviewer
Ed25519/ED448 키를 생성하려면 최신 OpenSSL 버전이 필요하며 (클라이언트 뷰어)/Xvnc(TigerVNC 서버)에서는 Ed25519/ED448 알고리즘에 대한 지원을 추가하려면 GnuTLS가 필요합니다.
현재 지원되는 알고리즘을 확인하세요.
#GnuTLS
gnutls-cli --list | grep EdDSA
#OpenSSL
man -P cat genpkey | grep "Valid built-in algorithm"
openssl list -public-key-algorithms | grep ED
#If EdDSA targeted algorithm is supported there is no need to install from sources
OpenSSL 빌드, 설치 및 사용:
wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz
tar -xvf openssl-1.1.1g.tar.gz
cd openssl-1.1.1g/
./config no-nextprotoneg no-weak-ssl-ciphers no-ssl3 no-shared -DOPENSSL_NO_HEARTBEATS -fstack-protector-strong enable-tls1_3
make install -j2
# After install, OpenSSL can be used
# for instance as follow to generate the needed key
/usr/local/bin/openssl genpkey -algorithm ED448 -out ~/.vnc/ssl/ca.private.eddsa.ed448.key.pem
GnuTLS를 빌드, 설치 및 사용합니다.
wget https://www.gnupg.org/ftp/gcrypt/gnutls/v3.6/gnutls-3.6.14.tar.xz
tar -xvf gnutls-3.6.14.tar.xz
cd gnutls-3.6.14/
./configure --without-tpm --disable-tests --disable-full-test-suite --disable-non-suiteb-curves --disable-ssl2-support
make install -j2
# This is required for Xvnc and vncviewer, after install can be used
# by setting LD_LIBRARY_PATH before running vncviewer or Xvnc,
# like the following example
# TigerVNC Server
export LD_LIBRARY_PATH=/usr/local/lib64:/usr/local/lib:/usr/lib
vncserver
# TigerVNC Viewer
env LD_LIBRARY_PATH=/usr/local/lib64:/usr/local/lib:/usr/lib vncviewer
# To check the used version we can use ldd for instance
ldd /usr/bin/vncviewer
실험 노트
TigerVNC 서버와 함께 KDE를 사용할 때 서버를 여러 번 중지/시작할 때 일부 X 응용 프로그램이 계속 실행됩니다.이 시스템이슈, 수정 다음 스크립트를 사용하여 서버를 중지할 수 있으며(systemd 서비스 프로필에서도 작동), ps aux | sort | grep USER-NAME | grep -v '\['
명령을 사용하여 서버를 중지한 후에도 여전히 실행 중인 항목이 있는지 확인할 수 있습니다.
#cat /usr/bin/vncserver-stop (this is meant for KDE)
#!/bin/sh
vncserver -kill :0
vncserver -kill :1
vncserver -kill :2
vncserver -kill :3
killall Xvnc -9
killall kwin_x11 -9
killall startplasma-x11 -9
killall plasma_session -9
killall Xvnc -9
killall kwin_x11 -9
killall startplasma-x11 -9
killall plasma_session -9
뷰어에서 여러 테스트를 거쳐 얻은 최고의 속도 성능vncviewer -QualityLevel=4 -CompressLevel=2 -PreferredEncoding=Raw
서버가 인터넷에 노출되어야 하는 경우 VNC 서버는 nmap 스캔( nmap -sV -sC TARGET-IP
)을 통해 쉽게 검색할 수 있으며 VNC 프로토콜은 자체적으로 선언해야 하므로 서버와 클라이언트의 사용자 정의 버전을 생성할 필요가 없습니다. 서버가 글로벌 인터넷에 노출된 경우 수행될 수 있습니다. VNC 서버를 난독화합니다.