找回密码
 注册
查看: 1273|回复: 3

关于OpenStack中虚拟机VNC访问安全问题

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2022-1-17 09:55:59 | 显示全部楼层 |阅读模式
关于OpenStack中虚拟机VNC访问安全问题
! d. u: ?9 _( @2 t前几天收到甲方给出的文件信息,线上OpenStack环境的物理机VNC端口能够自由访问,要求整改。
" P9 ^& G# c! K随机抽查了两台宿主机的VNC端口,确实很多业务的同学使用noVNC后没有退出终端的习惯,往往都是用完了就直接关闭窗口。不得不说这样隐患很大啊,首先不说通过外部方式规避风险,如果内网里面有一些script kiddie随时都能将我们线上的虚拟机VNC端口扫出来干些坏事。我这里也用过nmap测试了下开发环境的网络端口,如下:8 b  k6 N2 W, a- T* j
[root@controller1 ~]# nmap 10.161.53.1
: s2 V0 ~% `& f1 b% C0 TStarting Nmap 6.40 ( http://nmap.org ) at 2022-01-17 09:46 CST6 U' R* h2 x$ @1 j# B  o
Nmap scan report for compute10 (10.161.53.1)' b6 f& u- U# M: a
Host is up (0.000080s latency).0 M! e' Z' u# M) Z9 b
Not shown: 989 closed ports" [1 {3 N: E5 m. |; y
PORT     STATE SERVICE
0 Z9 _7 Z' D6 V& C22/tcp   open  ssh
: }& v+ F* @% e& M5900/tcp open  vnc
* d" z5 l) z, E5 n0 h+ k7 d5 z, M0 b5901/tcp open  vnc-1* b  X; w) ]+ p0 P# [/ f" f7 M( R- l3 V
5902/tcp open  vnc-2
1 K2 s- x2 o/ B* B2 ~$ d% b5903/tcp open  vnc-3( C( S1 ]' V1 D1 l& q
5904/tcp open  unknown4 p# _& V" T( a( j+ i7 j5 L% F
5906/tcp open  unknown
1 p% g6 ~7 W" c5907/tcp open  unknown
, h; l; U, |0 s* |5910/tcp open  cm6 u& V  f& o  u( r/ q- M
5911/tcp open  cpdlc4 W5 Q4 C$ k6 y. p3 ]+ N
8022/tcp open  oa-system
0 V/ t) K5 |- s* v% NMAC Address: D4:5D:64:08:45:02 (Unknown)* i! j" O6 ?2 q) X% |
Nmap done: 1 IP address (1 host up) scanned in 1.65 seconds6 W# @( _  Y' T
[root@controller1 ~]# nmap 10.161.53.2
0 m" j+ y. ~3 H, WStarting Nmap 6.40 ( http://nmap.org ) at 2022-01-17 09:46 CST+ a8 s- V, J1 i$ T, F4 I
Nmap scan report for compute11 (10.161.53.2)
7 \1 x# t1 j2 g$ fHost is up (0.000070s latency).
  \  l( e) h; x/ Z  V/ t3 z9 a  I( rNot shown: 989 closed ports* [1 o( t, ~% [4 q5 Y
PORT     STATE SERVICE) i+ q. z6 n/ }
22/tcp   open  ssh9 h3 |# `! a8 X4 A) f5 T
5900/tcp open  vnc5 T8 q! F, K6 A  M% c6 \- u) W
5901/tcp open  vnc-1
# k9 ^- W9 ]' e5 H1 E5 }3 M5902/tcp open  vnc-2
6 L5 t8 z* r" u/ ~6 M' \3 k0 K5903/tcp open  vnc-3
! |1 F, Y3 ?/ `0 y) H* Z5904/tcp open  unknown: e1 k" b5 P( l! T" x0 Y
5906/tcp open  unknown* S; C6 T: K  y8 H/ z* H& ^
5907/tcp open  unknown/ Y$ D% _* I4 M9 |6 g: q6 x
5911/tcp open  cpdlc! k- q8 H2 w7 c6 X& }
5915/tcp open  unknown$ j7 o8 ^$ X- U7 y
8022/tcp open  oa-system: `. G9 D- G# I) {
MAC Address: D4:5D:64:07:B3:DA (Unknown)
' I1 X0 n% @$ b. i5 S/ jNmap done: 1 IP address (1 host up) scanned in 1.67 seconds& @, w0 @# G% R: N, Q( U; d4 f
[root@controller1 ~]# nmap 10.161.53.3! X1 F$ ~( @. ], i$ _4 ]( B
Starting Nmap 6.40 ( http://nmap.org ) at 2022-01-17 09:46 CST$ l$ ~+ f# @. F6 ^
Nmap scan report for compute01 (10.161.53.3)
4 x2 H) o8 B% JHost is up (0.000076s latency).
5 \5 L1 `; U( g+ O- _" RNot shown: 992 closed ports
3 V5 O; K. P* ?8 o1 ]  b! ?5 y" t* gPORT     STATE SERVICE6 l2 B' i) |; U6 G( c
22/tcp   open  ssh
; X7 a( J( U/ M) K. |# s0 t7 W5900/tcp open  vnc
% P. J( @' y: ^8 O( k# Q4 K5901/tcp open  vnc-1
; w: F' h% U# V1 r5902/tcp open  vnc-22 v: e9 Q  l+ l2 u
5903/tcp open  vnc-3) a0 H- v" V. w. ?8 l3 S- e
5904/tcp open  unknown
  ?, h& _9 {2 \# D5906/tcp open  unknown. O$ o' S+ o& c2 ^
8022/tcp open  oa-system% z9 n1 d. l8 W: q1 L; j
MAC Address: D4:5D:64:08:45:5E (Unknown)& ~* G, [3 Y7 R( N
Nmap done: 1 IP address (1 host up) scanned in 1.68 seconds4 H  q5 L' n: R
[root@controller1 ~]# nmap 10.161.53.4
. @5 s  c2 j3 Q; v( f3 |Starting Nmap 6.40 ( http://nmap.org ) at 2022-01-17 09:46 CST
4 p* A# N; k  O. F8 pNmap scan report for compute02 (10.161.53.4)7 l" P& P1 e( }$ p9 h
Host is up (0.000081s latency).% j2 O: C. V8 Y) S1 s
Not shown: 988 closed ports
+ P- z/ r( [) |* O5 g' TPORT     STATE SERVICE# _; x5 |/ i5 D
22/tcp   open  ssh
- j9 @8 f1 @" F7 s" o+ v5900/tcp open  vnc
7 b+ w  e- r' w- E5901/tcp open  vnc-1; s- I. p! U. ?# [4 f6 U
5902/tcp open  vnc-2
, k7 N6 z! h  g$ g9 J* Z& r5903/tcp open  vnc-3+ m5 g" Q& I: }
5904/tcp open  unknown
% X, D2 R$ `+ f' g9 A& o+ v5906/tcp open  unknown4 L7 G* G: y: n; M
5907/tcp open  unknown
1 I2 _2 @  \8 N2 h7 B% Z1 h# z5910/tcp open  cm
) g9 y# f, S0 X) W+ {% B5 b5911/tcp open  cpdlc8 ]; w% ]' n* `0 C, e; Z8 g8 R
5915/tcp open  unknown3 i4 |; m; T' A4 y' n
8022/tcp open  oa-system) D2 c, _4 F+ s& Q
MAC Address: D4:5D:64:08:45:D6 (Unknown)  L; K& _/ ~; A( c
Nmap done: 1 IP address (1 host up) scanned in 1.67 seconds
) T4 B1 N/ V; F3 @6 @[root@controller1 ~]# nmap 10.161.53.5* @1 a+ M9 v! }
Starting Nmap 6.40 ( http://nmap.org ) at 2022-01-17 09:47 CST
& t9 t, x3 E8 u4 @Nmap scan report for compute03 (10.161.53.5)1 e3 S1 u  u3 A% ^
Host is up (0.000082s latency).& Z9 l" A6 n3 |, p6 L: N
Not shown: 993 closed ports
: l* A- F3 c: n, T0 _2 W$ GPORT     STATE SERVICE5 r6 L/ t; r- b* A- p% M8 x- ]7 t7 T1 _8 C
22/tcp   open  ssh
1 J& L: n% p- W; t# T5900/tcp open  vnc
1 D$ F: }8 m% B  ~8 x0 t; O5901/tcp open  vnc-1
* D; t& |2 U2 `. }6 L8 u5902/tcp open  vnc-2
' Z% k6 T- S5 c" s: N6 J: L5903/tcp open  vnc-3
7 f) f, Z# G& Q8 {7 G5904/tcp open  unknown5 Q6 H, p/ Y5 [+ M( o# _: z& a5 p5 {
8022/tcp open  oa-system# Q2 N) u. W0 T
MAC Address: D4:5D:64:08:44:DE (Unknown), B0 j2 j4 k& ^" x) v2 ?8 E
Nmap done: 1 IP address (1 host up) scanned in 1.67 seconds
% W) i% i; E- [[root@controller1 ~]# nmap 10.161.53.6
% X$ M( \/ R. E7 w) b  M( W( H$ IStarting Nmap 6.40 ( http://nmap.org ) at 2022-01-17 09:47 CST1 t, k: G& {7 I8 j9 d0 E! F
Nmap scan report for controller1 (10.161.53.6)  y- \2 Z, K! _1 `+ W1 z) I
Host is up (0.000014s latency).
& @( h  y. E, W/ nNot shown: 992 closed ports, I7 S7 @3 Z2 f9 w, P1 h! U
PORT     STATE    SERVICE
( u8 c/ Q3 C% J22/tcp   open     ssh
6 k+ U' v) ?0 y7 }80/tcp   open     http
! C2 V0 x+ a; y1 g! q1984/tcp open     bigbrother' _* H' c, |, K/ Y; M
3306/tcp open     mysql. l) Q! \$ j$ P# x% w
4000/tcp filtered remoteanything- P# Y3 ]- U5 q9 U9 P- V
4567/tcp open     tram' ?' v! w1 w" B6 p
5000/tcp open     upnp" v8 S- L( v0 V, l5 x( {
5001/tcp open     commplex-link
# k: P: b/ {1 ]9 q$ o% ?Nmap done: 1 IP address (1 host up) scanned in 2.75 seconds
- p3 d" M7 K- h  q) w0 K( o# e[root@controller1 ~]# nmap 10.161.53.7" ]$ |. J! \9 b9 E: ~. I+ l
Starting Nmap 6.40 ( http://nmap.org ) at 2022-01-17 09:47 CST
0 ~7 }; W& c5 b- |' ^Nmap scan report for controller2 (10.161.53.7)" l6 t% O& }% H) Y- G$ L
Host is up (0.000078s latency).
; ?) X) o1 k' A/ X* @Not shown: 993 closed ports
$ S. p* J& `* `- O; N' gPORT     STATE SERVICE% n) ~9 v% b; c! j
22/tcp   open  ssh* t: ~7 z' J9 m  Q; B
80/tcp   open  http9 `/ Y, R# @# |2 b7 n. n0 m
1984/tcp open  bigbrother
- Q, ]& k% `! s& k& k/ G* I: s5 r% m. L3306/tcp open  mysql7 f/ ?! C+ `, @' D1 F7 j! {; j
4567/tcp open  tram8 d+ b5 |7 }4 c5 [, L
5000/tcp open  upnp! N2 e! o: \& Z9 ~
5001/tcp open  commplex-link8 {; q: r# x( f; Y* X4 Q- [
MAC Address: D4:5D:64:08:45:0A (Unknown)" }8 m. q/ v( u
Nmap done: 1 IP address (1 host up) scanned in 1.55 seconds
+ m! o4 a7 S) s' x' l" h& |$ {! j1 j: u0 a
结果太恐怖了吧,如果有业务同学在使用noVNC之后没有退出终端,那么另一个人如果知道了宿主机的IP和端口是完全可以登录这台虚拟机的,直接操作虚机,后果不堪设想:
. Z- c3 J  u# ^7 I0 l6 R8 J+ ], P( g1 a: I( C8 W8 |
解决6 A0 T* z, r- V; [
知道了问题,那就有对应的解决方案!
: A* a8 @" ]8 K" V, E目前我们暂时只想到两个方法来解决这个问题,其他方法还有待大牛给予指导:
: S4 |. H  `- }( w# }; P. o
. s+ S4 u/ ^9 K1 d7 S' k方案一
1 a" {" g6 m1 ?通过firewalld限制INPUT表对5900:6000的访问规则
, o* G" t* Y8 T' f4 b( X方案二
  A0 r$ x/ Q! v* [( O添加密码访问VNC4 ]. m* l' \# z3 S

! P# n5 u% c5 Z: n, l操作5 ?( R* x& v: Q  g( U
firewalld/ Z: A* k" R  s% W$ l" C
我们知道OpenStack通过VNC Proxy将管理网和业务网隔离开来,以便我们可以使用管理网络的6080端口访问虚拟机VNC,同时提供Token用于验证访问的合法性。一个VNC Proxy在OpenStack里的处理流程如下:
1 `% L1 v) w1 ]3 c5 w; ^* F
VNC Porxy处理流程) A, P' C: G6 I9 l
1. 一个用户试图从浏览器里面打开连接到虚拟机的VNC Client. s, _9 Y; d$ V9 k4 f
2. 浏览器向nova-api发送请求,要求返回访问vnc的url
) I8 C. z; o8 x% N% ]4 T3. nova-api调用nova-compute的get vnc console方法,要求返回连接VNC的信息
1 e* e% o- w* ^. Z  d4.nova-compute调用libvirt的get vnc console函数' o7 t5 I  h" r
5.libvirt会通过解析虚拟机运行的/etc/libvirt/qemu/instance-0000000c.xml文件来获得VNC Server的信息% h- e9 N2 {$ r+ d/ u( T8 q" N7 G. n6 l
6.libvirt将host, port等信息以json格式返回给nova-compute
$ U7 `. r  d1 H3 ?7.nova-compute会随机生成一个UUID作为Token
( V+ m% z3 ^0 M% q% ?7 A5 }6 x! T8.nova-compute将libvirt返回的信息以及配置文件中的信息综合成connect_info返回给nova-api  E0 e" K7 m+ \, g0 V$ F& i* f4 |
9.nova-api会调用nova-consoleauth的authorize_console函数( q; H* @. G' Q9 j) t, M
10.nova-consoleauth会将instance –> token, token –> connect_info的信息cache起来7 Y1 l% E% C: [  i5 Y
11.nova-api将connect_info中的access url信息返回给浏览器:http://contorller:6080/vnc_auto.html?token=7efaee3f-eada-4731-a87c-e173cbd25e98&title=helloworld%289169fdb2-5b74-46b1-9803-60d2926bd97c%29, f$ q0 J- O  g/ ^
12.浏览器会试图打开这个链接
( \+ M6 z% g! M$ w5 ]13.这个链接会将请求发送给nova-novncproxy
2 O/ |6 ^+ y; `) v. }14.nova-novncproxy调用nova-consoleauth的check_token函数7 n4 n" X/ n9 `9 }
15.nova-consoleauth验证了这个token,将这个instance对应的connect_info返回给nova-novncproxy
: ^! b/ j2 m, b4 U16.nova-novncproxy通过connect_info中的host, port等信息,连接compute节点上的VNC Server,从而开始了proxy的工作

4 g- f9 Z. U. w; G/ S2 @6 t$ ~. s这里重要的就是第16步, nova-novncproxy是通过连接host:vncport的方式提供vnc访问服务。
6 d: S% [6 J- a那么也就是说,计算节点的VNC端口只需要让nova-novncporxy服务能够访问就行,有了这个就好办了。

% R# }1 `4 G( Y5 m7 s+ H3 h* t+ p5 e! |操作firewalld" m  [' D: L4 }8 c
在所有计算节点firewalld的INPUT表中添加如下规则:& U- j! e+ J" l
; M* F* `3 S; O. H: w
检查防火墙是否启动:8 T3 y/ @/ M  C* S8 e& H& R
systemctl status firewalld.service/ s4 b( }, \' O! v3 {2 z
启动防火墙:
5 `6 L  `+ I5 Z) Dsystemctl start  firewalld.service
9 t' Y& B5 _' p& [  q% I' {" F
# [4 Q! I( R% U* w
, t: k0 z: e$ C3 d, G; T7 S
开机启动防火墙:
% v- r" \( b  \/ msystemctl enable firewalld.service
0 i9 O+ a+ i" y1 b; H添加规则:
8 P/ D( u% ^( ]8 i3 K
  firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="10.161.53.6" port protocol="tcp" port="5900-6000" accept"% ?; \/ O" }8 z2 Y, ?
   firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="10.161.53.100" port protocol="tcp" port="5900-6000" accept"
7 I* \3 V0 c0 i3 u+ K firewall-cmd --reload 3 j/ d. L3 R9 b6 N% G
firewall-cmd --list-all
2 p+ g, K3 H) ^6 X7 z. {: F删除规则:
% y$ k; m. n) F; ]2 Q, ^% ]  firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="10.161.53.6" port protocol="tcp" port="5900-6000" accept"
" @# e) h: k" {$ O& G" |2 W$ D  U
firewall-cmd --reload 7 V! l7 q1 M  x
firewall-cmd --list-all
& O2 Z, r* G7 \, ^3 f, r4 ]9 j3 [7 l" S- W2 j' @! p1 @

2 L' F9 }, C* E( m+ A添加防火墙规则:# g( n* @+ O6 Q8 d
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="10.161.53.31/27" port protocol="tcp" port="5900-6000" accept"6 O  Q. H* M, b

: m1 f! U" M; P! P: Wfirewall-cmd --reload / }2 D- O0 y$ S  E% D

7 B: j2 e, `9 r, p& v% C" v) s通过测试上面开启的firewalld会导致业务无法访问。, a. o' z% F2 j
这里改变方式使用iptables的规则吧:
# W# t- a. v, r/ u, {9 \- W' E1 o' q  V8 b+ F
iptables -A INPUT -s 10.161.53.31/27 -p tcp -m multiport --dports 5900:5999 -m comment --comment "ACCEPT VNC Port only by Controller Node" -j ACCEPT' w3 m) g( w5 s. _' j  T
iptables -L4 V" W& N, \2 N8 \, ]2 v
iptables -A INPUT -p tcp -m multiport --dports 5900:5999 -j REJECT --reject-with icmp-port-unreachable# P# S& ^7 y( r+ F; ~6 k( r
' F! X: D# K  e. f# q* ~

- A; O6 r" q! _' P( n$ w# F) s* S! t) J3 U. H9 G6 l# s7 h

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2022-1-17 10:59:40 | 显示全部楼层
4.解决方案
4 u. z5 i& I7 f3 x' _0 ~( p3 _& h: e/ X' f# O
①从交换和防火墙的ACL控制IP访问7 o, @0 z9 I/ S# M
②修改各计算节点 nova.conf中 vncserver_listen 配置为内网 IP ,保证新建虚机没问题3 `% B9 x, V  e% \: t
③现有以及之后新建的的虚拟机,修改 libvirt.xml 中的 vnc 的监听端口,保证虚机重启后不会向公网开放端口- b" S' f; z: g5 b
④修改IPtables配置规则,屏蔽端口访问,把除内网以外网段的5900~5999端口给封禁: _8 m7 Y# V6 G. r
⑤vnc增加访问密码
, T! f/ V; n' _2 z& G5 F$ W
$ e+ J8 E* Q, e( q/ h6 C" J下面针对方法④和方法⑤进行详细的说明。* d; i4 M  |" f7 t4 K( i
④配置IPtables4 i4 b, k. h/ @
根据OpenStack VNC Proxy 流程分析中的,第16步, nova-novncproxy是通过连接host:vncport的方式提供vnc访问服务。即,计算节点的VNC端口只需要允许让nova-novncporxy服务能够访问就行。+ v$ N' _. i$ r# V' b# B5 E
在所有计算节点IPTABLES的INPUT表中添加如下规则:
( o. a8 p4 v9 {% x" R/ k# @3 \/ k4 H2 f. a9 o# p

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2022-1-17 14:49:23 | 显示全部楼层
①从交换和防火墙的ACL控制IP访问) x- v# N2 P3 P+ ?* w" _7 @
②修改各计算节点 nova.conf中 vncserver_listen 配置为内网 IP ,保证新建虚机没问题
2 D- u' n; m% f8 J③现有以及之后新建的的虚拟机,修改 libvirt.xml 中的 vnc 的监听端口,保证虚机重启后不会向公网开放端口
: s+ T% W7 B3 `# n④修改IPtables配置规则,屏蔽端口访问,把除内网以外网段的5900~5999端口给封禁
+ m4 g7 O  }5 ^  {7 r. x, a% D⑤vnc增加访问密码, z1 W; _1 w* A9 E. l( E
下面针对方法④和方法⑤进行详细的说明。1 F+ X) P& _% o/ t2 b  g0 O! s7 G
④配置IPtables
" x7 n: E" {  F根据OpenStack VNC Proxy 流程分析中的,第16步, nova-novncproxy是通过连接host:vncport的方式提供vnc访问服务。即,计算节点的VNC端口只需要允许让nova-novncporxy服务能够访问就行。# Z# r7 B" r1 h. p/ I6 I
  f. P9 L2 M+ y/ x$ D
在所有计算节点IPTABLES的INPUT表中添加如下规则:
9 @9 l) P% Q( P7 @, \( I' t# p
6 Q" s) r0 `* s. J. X$ iptables -A INPUT -s {{ CONTROLLER_NODE_IP }}/32 -p tcp -m multiport --dports 5900:5999 -m comment --comment "ACCEPT VNC Port only by Controller Node" -j ACCEPT
7 d) h' Q3 H) @8 e* ]9 S9 I( M0 F1 i1 I
$ iptables -A INPUT -p tcp -m multiport --dports 5900:5999 -j REJECT --reject-with icmp-port-unreachable
! w" w9 k5 H: e( S# \; x, r% {9 O3 N' ?0 w3 R! S
意思就是只允许控制节点访问本机的5900-5999端口,其他的一律拒绝。" @# j8 ~2 ~1 ?5 [& `' i+ f1 _
当再次使用nmap进行扫描时,便不能看到VNC的端口。" l0 k8 N6 Y6 A( g! m& L
* z7 ~& N( r/ F0 H% e9 K
$ nmap 10.161.53.1 5900
9 q3 g% U* a6 v7 s⑤VNC添加访问密码
2 D' E, @' l* l" O/ M0 N9 W/ w对应的配置文件为:virt/libvirt/config.py/ w# o# q0 o" n$ e2 j* H

: q! j/ k3 A0 h  a7 llibvirtd在<graphics>域里面是支持配置VNC的访问密码
8 P- d' W' o5 [, k; F  {2 [, c0 u$ t: ]$ F+ F1 z
...9 x, ^( Q' ~% Z% a) m
<graphics type='vnc' port='-1' autoport='yes' listen='192.168.23.59' passwd='YOUR-PASSWORD-HERE' keymap='en-us'/># O( T* V; B/ O1 T; K( a1 M
...5 ?, c+ ?+ U2 b1 ]2 b( [% `
,那么Nova在创建虚拟机配置的方法中也可以找到对应graphics的代码,我这里修改得很简单,直接在返回的dev列表里面添加个passwd的value,而value就是VNC的访问密码。
# V  `! h, v( ]% L1 N  c) a: Q$ i3 T4 c" T$ B* x3 F
class LibvirtConfigGuestGraphics(LibvirtConfigGuestDevice):2 C  h9 y( C1 _- O. `

0 b' Y" @* V" S4 m1 L( s    def __init__(self, **kwargs):
5 {& M# C+ p# A( D0 @* R         super(LibvirtConfigGuestGraphics, self).__init__(root_name="graphics",. K$ q2 F$ _6 G" `/ j8 ?- T
                                                          **kwargs)% [: U! c9 [1 ^9 v  ?
% ~, f0 I3 u6 l. G9 [) [) q
         self.type = "vnc"0 t  W5 A) A3 j7 A) \  Q6 D
         self.autoport = True* Z1 R% M: s6 l3 z2 ?
         self.keymap = None
/ s( Z% v" g$ Q4 S0 C, h         self.listen = None
, R. h0 _+ d5 O: }& q: f 2 y. ?, H! F( S: Z2 a
     def format_dom(self):
9 @* P9 O5 h7 Z$ \% _! `( y         dev = super(LibvirtConfigGuestGraphics, self).format_dom(), n" H3 l, b# o: ~( H" p5 L
1 I1 S% J: j" `: ^
         dev.set("type", self.type)- a* G( i5 l, T7 u% S3 M4 K. Y
         if self.autoport:
9 M+ y% r; M( P2 E- n             dev.set("autoport", "yes")
+ F2 x7 I, I/ V6 i6 `9 }/ l         else:
1 a5 |) s- B2 c5 k/ w             dev.set("autoport", "no")2 a# v; \( r/ F2 S: E' _
         if self.keymap:
6 y5 n0 b" {: Z+ w3 l# G             dev.set("keymap", self.keymap)
; f  N% i( A4 y9 X         if self.listen:1 }' Q' }( b0 H0 W8 e/ Y
             dev.set("listen", self.listen)! ]- O! B: Z  k' b: w
#       dev.set("passwd", "123456")
8 ^* h3 B0 O- x' W& W4 w! o/ N/ j         return dev
* o* r* S: l8 Q8 q, L: q. y其中dev.set("passwd", "123456")是新加入的一行,如果不需要vnc访问输入密码,直接注释掉即可。) \1 t4 s) I* J% m* d1 d$ {
下面是一次解决过程,因开发环境使用的是容器化部署,文件路径比较长。# q( \1 _- m& R, \# [* y* y8 l  D' p
解决过程( ^1 P9 I  B& a
查找文件+ B9 Z9 {; _" b" R* u  Z

6 |: l- o8 [  z9 [root@controller1:~# find /var/lib/docker/aufs/diff  -name config.py | grep nova2 w0 P1 P! I/ p& i. B
/var/lib/docker/aufs/diff/pr0XDEZwLDflwwzUPc0mNVYwf6b3wJ4wxEwxNBRlmKMD7qRurdlBck41J8hAkjd3/usr/lib/python2.7/dist-packages/nova/config.py+ x* T# i; z$ T# u" X9 F7 j/ m
/var/lib/docker/aufs/diff/pr0XDEZwLDflwwzUPc0mNVYwf6b3wJ4wxEwxNBRlmKMD7qRurdlBck41J8hAkjd3/usr/lib/python2.7/dist-packages/nova/virt/libvirt/config.py8 p, v5 K9 X! N% \2 V
/var/lib/docker/aufs/diff/pr0XDEZwLDflwwzUPc0mNVYwf6b3wJ4wxEwxNBRlmKMD7qRurdlBck41J8hAkjd3/usr/lib/python2.7/dist-packages/nova/common/config.py' c6 ?' V2 M6 }4 K
进入配置文件所在路径6 S: x7 |/ a2 O+ O& ]  M& `

" [0 j+ j, i. q8 z  |+ Rroot@controller01:~# cd /var/lib/docker/aufs/diff/pr0XDEZwLDflwwzUPc0mNVYwf6b3wJ4wxEwxNBRlmKMD7qRurdlBck41J8hAkjd3/usr/lib/python2.7/dist-packages/nova/virt/libvirt/
2 r, L; ?0 s# ^  I! Qroot@controller01:/var/lib/docker/aufs/diff/pr0XDEZwLDflwwzUPc0mNVYwf6b3wJ4wxEwxNBRlmKMD7qRurdlBck41J8hAkjd3/usr/lib/python2.7/dist-packages/nova/virt/libvirt# ls( T% _$ q) p( q5 V# H6 D: `; y
blockinfo.py   compat.py   config.py          config.pyc   designer.pyc  driver.pyc   firewall.pyc  guest.pyc  host.pyc         imagebackend.pyc  imagecache.pyc  __init__.pyc           instancejobtracker.pyc  migration.pyc  utils.py   vif.py   volume
) ]/ g, h& G, J4 k& mblockinfo.pyc  compat.pyc  config.py.bak.ori  designer.py  driver.py     firewall.py  guest.py      host.py    imagebackend.py  imagecache.py     __init__.py     instancejobtracker.py  migration.py            storage        utils.pyc  vif.pyc
" b/ B/ z: I' l/ d0 I. v7 ]修改配置文件& a& m- G3 D- Z* ~! y8 {0 R- |

/ d' s% z0 q7 ]root@controller1:/var/lib/docker/aufs/diff/pr0XDEZwLDflwwzUPc0mNVYwf6b3wJ4wxEwxNBRlmKMD7qRurdlBck41J8hAkjd3/usr/lib/python2.7/dist-packages/nova/virt/libvirt# vim config.py: u% q6 X/ ~" J1 F! C0 Q$ P
在这里插入图片描述, ^' p0 I1 {+ w4 z, [
修改后,重启nova-compute服务,即在下次创建虚拟机的时候生效,其结果如下:+ f. E/ k2 s$ R  x" V/ k, o# l  f
在这里插入图片描述
) s) |- J' J, B  ?! Z, h5 c输入密码virt/libvirt/config.py配置中新增的密码123456即可正进入虚拟机。
) ~" W8 a' k! [! B6 D

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2022-1-17 17:05:37 | 显示全部楼层
4.解决方案$ Z1 F0 U- t( @/ q# \3 B
①从交换和防火墙的ACL控制IP访问
$ J- P9 P( u* |②修改各计算节点 nova.conf中 vncserver_listen 配置为内网 IP ,保证新建虚机没问题7 O5 O% d4 v- R' s/ b, p
③现有以及之后新建的的虚拟机,修改 libvirt.xml 中的 vnc 的监听端口,保证虚机重启后不会向公网开放端口
( S" {; l2 v8 h& n④修改IPtables配置规则,屏蔽端口访问,把除内网以外网段的5900~5999端口给封禁7 O( a2 U" a3 i9 J" W/ o, }
⑤vnc增加访问密码* I( f7 R4 A! d' c/ n) F4 J
下面针对方法④和方法⑤进行详细的说明。
5 m# @2 ?- A; q& P  M+ ?9 g④配置IPtables
- z8 ?/ g  ?$ ], Z9 H( h& y根据OpenStack VNC Proxy 流程分析中的,第16步, nova-novncproxy是通过连接host:vncport的方式提供vnc访问服务。即,计算节点的VNC端口只需要允许让nova-novncporxy服务能够访问就行。+ v5 _! z& O% r; y- o8 A

7 F/ U. `0 @0 h. R4 Y2 S在所有计算节点IPTABLES的INPUT表中添加如下规则:
1 ~0 D; {' q4 o$ F9 p; `$ p
$ n2 c2 {% d" F2 f2 |$ iptables -A INPUT -s {{ CONTROLLER_NODE_IP }}/32 -p tcp -m multiport --dports 5900:5999 -m comment --comment "ACCEPT VNC Port only by Controller Node" -j ACCEPT0 W1 M7 @# P9 V# I3 h5 }. q

" i1 y8 ]0 F4 N8 S! X5 E0 w$ iptables -A INPUT -p tcp -m multiport --dports 5900:5999 -j REJECT --reject-with icmp-port-unreachable
. ?/ C6 X5 D# E( g意思就是只允许控制节点访问本机的5900-5999端口,其他的一律拒绝。' {7 N4 v2 F+ H: S; i" Y$ y
当再次使用nmap进行扫描时,便不能看到VNC的端口。
0 o3 Q2 R4 I( K, W9 {7 k+ \( j2 h
$ nmap 192.168.23.12
  v0 b  O8 o' Y8 J⑤VNC添加访问密码
7 F- e4 E' e+ U1 r: a对应的配置文件为:virt/libvirt/config.py) |% X5 c* f# a/ Q% g9 w3 P$ t
6 Z- ]& P# G( L5 J
libvirtd在<graphics>域里面是支持配置VNC的访问密码
+ z( S# Q6 z) a& W8 |) Y) u4 ?6 W( H+ z& e# F
...$ m4 }1 n: f. c4 x% ~$ \: o
<graphics type='vnc' port='-1' autoport='yes' listen='192.168.23.59' passwd='YOUR-PASSWORD-HERE' keymap='en-us'/>
. U/ c* Y0 M+ ]; Z...+ |' j6 z  w( ^2 O
,那么Nova在创建虚拟机配置的方法中也可以找到对应graphics的代码,我这里修改得很简单,直接在返回的dev列表里面添加个passwd的value,而value就是VNC的访问密码。
$ ?3 _/ ~" N- Y/ z
: }! |- _( L: R1482 class LibvirtConfigGuestGraphics(LibvirtConfigGuestDevice):
8 {; ~7 ]6 H! d+ [0 M# z4 n# O1483 , W% G, y' e7 I
1484     def __init__(self, **kwargs):
% }  k" h' L0 Q9 \: f* u7 \$ F1485         super(LibvirtConfigGuestGraphics, self).__init__(root_name="graphics",+ F5 O9 D5 V, h5 ]1 y
1486                                                          **kwargs)
; r# D) ]4 j; w/ [6 X) o1487
0 j5 P' x/ P$ c1488         self.type = "vnc"0 A! U/ G% B& x5 M; {2 s7 w
1489         self.autoport = True
! W- q. O1 _- k  W2 x( x1490         self.keymap = None
/ x; q5 v6 x! x8 D/ T0 V1491         self.listen = None+ Q+ k0 U5 b" q) o+ D
1492 0 s8 Z: S$ w2 u) B
1493     def format_dom(self):
6 v% @* V% G3 @1494         dev = super(LibvirtConfigGuestGraphics, self).format_dom()7 u6 t/ C) m, R3 ?
1495 - x( e3 n# H& `) {1 s( J6 d$ u
1496         dev.set("type", self.type); W- x( n3 _& G' A, V4 Y6 ^% I
1497         if self.autoport:0 y6 ]( g- K, Z  [2 B
1498             dev.set("autoport", "yes")
  _' D. ^  o" B9 S5 f1499         else:
( w( u5 M9 _6 o2 n1500             dev.set("autoport", "no")/ e! Z; z) R, T6 Q6 ?% x. e
1501         if self.keymap:  w( m2 r+ j: n; T; y( ^
1502             dev.set("keymap", self.keymap)
- F' b, E1 d5 u0 |$ {1503         if self.listen:/ m6 J, i0 Y$ t8 h: d! y
1504             dev.set("listen", self.listen)* l5 C2 {  k" Y% D# C5 l/ X& B* e: P
1505 #       dev.set("passwd", "123456")
* l; s4 b4 t7 u( |/ A1506         return dev
, ?* }' h; T) ]- e5 _+ G$ n) o其中dev.set("passwd", "123456")是新加入的一行,如果不需要vnc访问输入密码,直接注释掉即可。- E- \1 A- q" n/ u
下面是一次解决过程,因开发环境使用的是容器化部署,文件路径比较长。' A, s: E: Q& f8 `3 h# N1 L7 t+ ^
解决过程
) b( _  ^! W7 \6 W' W( D查找文件( ]' ~4 }4 {8 N6 q6 R' \6 a
9 Y8 [8 ?  K+ _- d* v
root@controller1:~# find /var/lib/docker/aufs/diff  -name config.py | grep nova# f; T- H& H) L: \8 S  W9 P
/var/lib/docker/aufs/diff/pr0XDEZwLDflwwzUPc0mNVYwf6b3wJ4wxEwxNBRlmKMD7qRurdlBck41J8hAkjd3/usr/lib/python2.7/dist-packages/nova/config.py" R1 r1 N1 l$ K! H9 F' o3 w" I
/var/lib/docker/aufs/diff/pr0XDEZwLDflwwzUPc0mNVYwf6b3wJ4wxEwxNBRlmKMD7qRurdlBck41J8hAkjd3/usr/lib/python2.7/dist-packages/nova/virt/libvirt/config.py
" [7 R3 @# H. q+ K9 ]/var/lib/docker/aufs/diff/pr0XDEZwLDflwwzUPc0mNVYwf6b3wJ4wxEwxNBRlmKMD7qRurdlBck41J8hAkjd3/usr/lib/python2.7/dist-packages/nova/common/config.py
9 T5 K- I2 r) R+ U5 F进入配置文件所在路径
; I9 Y8 t( U/ C9 Z5 l- ^4 j- S6 D" R2 W( S5 u# ]
root@controller01:~# cd /var/lib/docker/aufs/diff/pr0XDEZwLDflwwzUPc0mNVYwf6b3wJ4wxEwxNBRlmKMD7qRurdlBck41J8hAkjd3/usr/lib/python2.7/dist-packages/nova/virt/libvirt/$ }  \7 {& z4 V" p" k  m
root@controller01:/var/lib/docker/aufs/diff/pr0XDEZwLDflwwzUPc0mNVYwf6b3wJ4wxEwxNBRlmKMD7qRurdlBck41J8hAkjd3/usr/lib/python2.7/dist-packages/nova/virt/libvirt# ls
, c; u. h! X' fblockinfo.py   compat.py   config.py          config.pyc   designer.pyc  driver.pyc   firewall.pyc  guest.pyc  host.pyc         imagebackend.pyc  imagecache.pyc  __init__.pyc           instancejobtracker.pyc  migration.pyc  utils.py   vif.py   volume
2 y3 l$ i1 J0 b& e4 v1 Q! cblockinfo.pyc  compat.pyc  config.py.bak.ori  designer.py  driver.py     firewall.py  guest.py      host.py    imagebackend.py  imagecache.py     __init__.py     instancejobtracker.py  migration.py            storage        utils.pyc  vif.pyc
$ D; o+ R. W% h+ G" l修改配置文件
4 Q1 x" N& M2 E: i$ o+ _1 J  K: K" Y# q6 T9 L- v2 z/ ~: j& i+ q
root@controller1:/var/lib/docker/aufs/diff/pr0XDEZwLDflwwzUPc0mNVYwf6b3wJ4wxEwxNBRlmKMD7qRurdlBck41J8hAkjd3/usr/lib/python2.7/dist-packages/nova/virt/libvirt# vim config.py
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 00:09 , Processed in 0.017966 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表