- 积分
- 16840
在线时间 小时
最后登录1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
关于openstack中虚拟机VNC访问安全问题
_- f# Q" b* r& C/ u7 |, r. l前几天收到甲方给出的文件信息,线上OpenStack环境的物理机VNC端口能够自由访问,要求整改。
7 g b- q1 H1 S9 d u- f2 P4 Z随机抽查了两台宿主机的VNC端口,确实很多业务的同学使用noVNC后没有退出终端的习惯,往往都是用完了就直接关闭窗口。不得不说这样隐患很大啊,首先不说通过外部方式规避风险,如果内网里面有一些script kiddie随时都能将我们线上的虚拟机VNC端口扫出来干些坏事。我这里也用过nmap测试了下开发环境的网络端口,如下:
/ S* o% w0 b3 E0 Y$ v[root@controller1 ~]# nmap 10.161.53.10 h/ @0 C2 Z% N" N. |
Starting Nmap 6.40 ( http://nmap.org ) at 2022-01-17 09:46 CST; d( y% G( B; [+ a* d
Nmap scan report for compute10 (10.161.53.1)' T A2 ?4 l0 _+ r: f; r. e
Host is up (0.000080s latency).
' s$ o1 U. I. a2 V! NNot shown: 989 closed ports8 ?* m4 @* e" f
PORT STATE SERVICE2 |# K, O( o0 |- Y3 C
22/tcp open ssh5 t* X9 M' g6 ^3 z- D/ y) }9 a
5900/tcp open vnc9 z5 b& n! w0 S$ _ Q0 a" u
5901/tcp open vnc-1
: I! r$ G5 f8 k5902/tcp open vnc-2
) @) U* W# ~0 p' ^. v$ K: _. W5903/tcp open vnc-3( K, z' J% q- M4 n" g% r& O6 L
5904/tcp open unknown
: J$ N) p. ]3 \ o( H8 H" T+ B5906/tcp open unknown
" t2 W: K$ m- T6 d5907/tcp open unknown, i$ ], }8 k" c1 y) n
5910/tcp open cm
Y9 H0 J5 m# o- M0 O7 _& h5911/tcp open cpdlc
8 b3 F) h! D; \ h/ J. q# m8 m8022/tcp open oa-system
# l% n9 X, j7 F$ Y, e7 G5 Q8 lMAC Address: D4:5D:64:08:45:02 (Unknown)
6 n! t. b- r2 f0 @Nmap done: 1 IP address (1 host up) scanned in 1.65 seconds
0 Y% y! A5 n- w+ @; U[root@controller1 ~]# nmap 10.161.53.21 y7 e B% o7 E4 d: |
Starting Nmap 6.40 ( http://nmap.org ) at 2022-01-17 09:46 CST$ x& ~" D, h- Q& ^3 E. |
Nmap scan report for compute11 (10.161.53.2), b5 H/ g/ }* ~: \! X) U0 X- K
Host is up (0.000070s latency).5 p# A" ?/ \' ]1 y* u$ }
Not shown: 989 closed ports
6 F. p# p6 Y6 g3 ?- n: g' _; \PORT STATE SERVICE
0 Z3 I8 m# q# J22/tcp open ssh3 l5 N5 c# T0 ~
5900/tcp open vnc% ~" r) P. M& c; t3 i( O, A( _
5901/tcp open vnc-1! t6 [5 v1 t1 L, i
5902/tcp open vnc-2
, K$ i. u7 a& V5903/tcp open vnc-3) g# ^% `5 p u: K% m4 @
5904/tcp open unknown1 E1 V v5 b# ~6 I/ m: t
5906/tcp open unknown
+ n7 N1 E- s6 O5907/tcp open unknown
- Q' W, @6 @ E- C: l7 ~9 Y Z% A) W5911/tcp open cpdlc/ H: S# N2 i `; A+ O R9 q
5915/tcp open unknown
2 F: o. I, I+ G+ o2 `9 ^8022/tcp open oa-system
/ j0 ~1 k: i# @/ y% K+ F$ VMAC Address: D4:5D:64:07:B3:DA (Unknown)
/ j/ C2 [/ |) t2 kNmap done: 1 IP address (1 host up) scanned in 1.67 seconds
0 X) }) e3 @* C2 F" i( q8 ?9 R[root@controller1 ~]# nmap 10.161.53.3, P5 W. d P, r& @2 D0 w+ C
Starting Nmap 6.40 ( http://nmap.org ) at 2022-01-17 09:46 CST( B C" w, T/ ?% G N
Nmap scan report for compute01 (10.161.53.3)* H: q9 Z W/ P0 u
Host is up (0.000076s latency).: q# n& q" u5 t! J$ M! {4 a/ ?
Not shown: 992 closed ports1 f' Z. P4 L4 G/ d
PORT STATE SERVICE
7 T, F$ X( D5 x+ i' u22/tcp open ssh
. S: v7 T; M+ O, A3 n! p/ _. A5900/tcp open vnc M) g# m' l) @ a! e
5901/tcp open vnc-1
$ p2 z8 o U" g% }, N1 ?5902/tcp open vnc-2
& f2 f" t6 q- q5903/tcp open vnc-3
8 o. W3 |* R+ k) s6 _0 j' o5904/tcp open unknown: b. R, @, @' ?2 n( E# \
5906/tcp open unknown6 N0 t( }1 p' w, p, k$ F
8022/tcp open oa-system
8 ^$ n7 Z- Y) h9 M% IMAC Address: D4:5D:64:08:45:5E (Unknown)7 v2 D- o* p& Q! |! w# y2 I1 O* U7 J
Nmap done: 1 IP address (1 host up) scanned in 1.68 seconds% t: ^# L& J/ j5 f5 g: d; }
[root@controller1 ~]# nmap 10.161.53.4
4 w z$ l6 X% @2 JStarting Nmap 6.40 ( http://nmap.org ) at 2022-01-17 09:46 CST+ y6 L8 }; y% r$ [6 ~' k5 I' N
Nmap scan report for compute02 (10.161.53.4)
+ s; ~/ R% |2 _& A/ D# E/ |/ o/ c' gHost is up (0.000081s latency).3 P; z7 m8 m& L4 L0 r
Not shown: 988 closed ports6 n; q4 T+ b. B/ f* e9 J( i
PORT STATE SERVICE# ^& u+ p* A* B9 r @; L4 ?# [
22/tcp open ssh2 ~. K2 L' z! o
5900/tcp open vnc# }' ?6 L P# c( ?( s
5901/tcp open vnc-15 |9 ]0 t* R- |
5902/tcp open vnc-2) i( R2 j8 ~* T) i$ `
5903/tcp open vnc-3) s( D: r! X' g$ n5 ~ M; V
5904/tcp open unknown1 w; ?* M5 D3 p0 d3 Z* W+ K
5906/tcp open unknown' F4 R$ s; p* B& z8 d0 w5 _+ E
5907/tcp open unknown, x- i- r6 a. v# A) t8 [& j
5910/tcp open cm+ i5 O1 X6 W' j. ? H" x; T' p# C
5911/tcp open cpdlc6 j5 \/ O; ]* i: { y# Z9 s% q- V% ^
5915/tcp open unknown, |1 t& o8 K5 [, {0 R% P
8022/tcp open oa-system8 f' d% \2 |1 X9 c) g" v
MAC Address: D4:5D:64:08:45:D6 (Unknown)
. T7 n& p0 J+ G: F5 v6 O& F# N; K" R* gNmap done: 1 IP address (1 host up) scanned in 1.67 seconds
; O! d+ }2 Y1 X l8 S: ?( o9 G b[root@controller1 ~]# nmap 10.161.53.51 L( D; X; [# K
Starting Nmap 6.40 ( http://nmap.org ) at 2022-01-17 09:47 CST
; t. w2 i5 S8 ]4 h. `Nmap scan report for compute03 (10.161.53.5)1 ?. M. y# ]1 a) @ H7 m/ J
Host is up (0.000082s latency)." L% d) ]+ @" R7 x6 P
Not shown: 993 closed ports* U4 r, L7 M# d/ M( A
PORT STATE SERVICE& Q- {5 q6 }, \5 t s
22/tcp open ssh
, c1 B5 w9 @ p* n, g, ]. o5900/tcp open vnc( H4 U& y6 j1 X8 T/ h; d
5901/tcp open vnc-1
( c4 }/ X+ z1 X1 [. @/ T( c/ Q# A5902/tcp open vnc-2
$ A5 J5 D% a! U5903/tcp open vnc-3
' P8 A# m3 t( L5904/tcp open unknown" [. J1 h: V4 c) P8 |) g
8022/tcp open oa-system: d- o0 E+ U5 _1 Q
MAC Address: D4:5D:64:08:44:DE (Unknown)
9 `, W9 F- H+ e& KNmap done: 1 IP address (1 host up) scanned in 1.67 seconds9 e6 {9 ]0 p* N3 D: T
[root@controller1 ~]# nmap 10.161.53.67 `+ D e6 ^" W' k$ P [* Z" j
Starting Nmap 6.40 ( http://nmap.org ) at 2022-01-17 09:47 CST
! R# D( D0 T1 |1 s) oNmap scan report for controller1 (10.161.53.6)
3 t0 l) O+ E# r, ?2 o" T* RHost is up (0.000014s latency).( Z! i. s) o6 o0 f' A8 }1 @" L1 V
Not shown: 992 closed ports
! d& \. Y9 h' i8 J% _PORT STATE SERVICE
) S. W3 A$ @% V: z3 Q' H22/tcp open ssh; L; u J% Q5 k" `% H% Z# y; o" J7 S' L
80/tcp open http6 I6 j6 h& o; z( L: G
1984/tcp open bigbrother
% `7 w2 q2 T( P3 {$ h. [: g3306/tcp open mysql
0 Q, V- e# o3 M) F2 F4000/tcp filtered remoteanything! ^' v) L! K/ G, P
4567/tcp open tram; j: s" ~6 }2 u: A2 g7 y
5000/tcp open upnp
" p. r+ N `9 o" o5 x5001/tcp open commplex-link0 _) O. D- g8 r' N" o6 g$ d. p% i
Nmap done: 1 IP address (1 host up) scanned in 2.75 seconds# Y4 I I5 ]+ l# a- [( v2 R
[root@controller1 ~]# nmap 10.161.53.7
9 B% r$ ?# C$ v7 W) z) NStarting Nmap 6.40 ( http://nmap.org ) at 2022-01-17 09:47 CST
3 e6 j: w$ `( I/ @* Y3 b+ R6 V. D, v9 @Nmap scan report for controller2 (10.161.53.7)
3 L |4 g* l0 d0 Y% G# a) zHost is up (0.000078s latency).) F6 d5 D/ A- l- n" n
Not shown: 993 closed ports+ z h O) K4 W; G; X+ w' i, t
PORT STATE SERVICE+ Y5 n! o1 P4 p- A. T9 s( n }
22/tcp open ssh6 l$ g. k; D! b, w
80/tcp open http
% M0 {" Q T5 ]3 H( a- U1 M1984/tcp open bigbrother0 Z+ u1 M# b9 O) A% G
3306/tcp open mysql
# E- y2 I9 x4 Z4567/tcp open tram
* w4 f: R. Y: u5000/tcp open upnp" x( J7 I3 P7 f' t7 E; M
5001/tcp open commplex-link# w* q# e H3 J0 _9 L6 c' J* Y
MAC Address: D4:5D:64:08:45:0A (Unknown)
+ h) J- {* F; C1 A2 TNmap done: 1 IP address (1 host up) scanned in 1.55 seconds6 M/ C5 |( j4 k( a
8 Z* o* t( c; n* u6 W4 z结果太恐怖了吧,如果有业务同学在使用noVNC之后没有退出终端,那么另一个人如果知道了宿主机的IP和端口是完全可以登录这台虚拟机的,直接操作虚机,后果不堪设想:
$ b3 O7 V5 M6 f8 R1 o# V; H3 n9 O6 `6 Y1 |, @
解决
+ D% _& y. c' L* M* B+ i: ?% m知道了问题,那就有对应的解决方案!
9 d+ @; W# J3 ^/ q( Y+ }8 ]$ }目前我们暂时只想到两个方法来解决这个问题,其他方法还有待大牛给予指导:
; n5 p( Q5 E& Q& e
1 g2 G' I' U: \4 Q4 o* m方案一' f8 F+ n% ~3 c* Y
通过firewalld限制INPUT表对5900:6000的访问规则
( E2 \! w8 U8 n9 }方案二3 |7 ?( v/ C9 D% G' e4 M/ k
添加密码访问VNC& d0 n8 E* S2 C
9 j% y& l! d1 S9 m2 v2 ` l+ p操作) R- k5 M' ` f8 }
firewalld2 |/ @. V2 W( G. Z
我们知道OpenStack通过VNC Proxy将管理网和业务网隔离开来,以便我们可以使用管理网络的6080端口访问虚拟机VNC,同时提供Token用于验证访问的合法性。一个VNC Proxy在OpenStack里的处理流程如下:4 j) o, I$ e; V$ l
VNC Porxy处理流程
) L9 v6 k1 _6 Z v1. 一个用户试图从浏览器里面打开连接到虚拟机的VNC Client5 N6 m3 X k. w0 w+ `7 q
2. 浏览器向nova-api发送请求,要求返回访问vnc的url9 s& [: w# E4 D, v `
3. nova-api调用nova-compute的get vnc console方法,要求返回连接VNC的信息4 q; j8 _, V( k" Q7 M
4.nova-compute调用libvirt的get vnc console函数* A4 v. N4 ~5 a) I4 g3 t
5.libvirt会通过解析虚拟机运行的/etc/libvirt/qemu/instance-0000000c.xml文件来获得VNC Server的信息# l' r8 [9 T- V8 G4 ^0 c
6.libvirt将host, port等信息以json格式返回给nova-compute2 R3 Y6 C# R( O% `4 [* R2 j3 F
7.nova-compute会随机生成一个UUID作为Token9 X; k- f5 H; p8 P$ g# V
8.nova-compute将libvirt返回的信息以及配置文件中的信息综合成connect_info返回给nova-api
/ x2 u: O: y- }5 e w* e& w9.nova-api会调用nova-consoleauth的authorize_console函数- S7 R& `- z7 z& f
10.nova-consoleauth会将instance –> token, token –> connect_info的信息cache起来
0 D: b/ f7 _7 N6 _2 A4 Y( O11.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
: a o0 M7 Z- i3 E9 Z% j# {12.浏览器会试图打开这个链接
& S8 y1 _. y" T13.这个链接会将请求发送给nova-novncproxy/ D$ Q3 A& _" w7 r. e8 C3 a
14.nova-novncproxy调用nova-consoleauth的check_token函数2 `6 T3 Z( S |/ P" ?/ b/ w
15.nova-consoleauth验证了这个token,将这个instance对应的connect_info返回给nova-novncproxy
) C$ b) O& _, h; h6 v16.nova-novncproxy通过connect_info中的host, port等信息,连接compute节点上的VNC Server,从而开始了proxy的工作- _ T; j( m O5 L
这里重要的就是第16步, nova-novncproxy是通过连接host:vncport的方式提供vnc访问服务。# A7 v8 R/ y+ j: K4 L) Y
那么也就是说,计算节点的VNC端口只需要让nova-novncporxy服务能够访问就行,有了这个就好办了。; V- Q9 T( Y, g
操作firewalld3 Y4 [) t1 ^' p$ _2 W, p! d& s
在所有计算节点firewalld的INPUT表中添加如下规则: ~) n9 ?2 r. `
6 Y' c' }& B$ j+ e6 e2 m. m
检查防火墙是否启动:
6 W: m& f4 f' c" v9 ^4 Ksystemctl status firewalld.service
, K) T' |: N9 m4 y2 `2 Q/ F' i. L启动防火墙:+ a6 ]! F( l; _9 U
systemctl start firewalld.service
# S$ f3 S1 B$ s$ L% n( Z
! { }& O2 B7 @: o" E6 }) S$ e/ o9 j) U0 E$ `
开机启动防火墙:
0 D* S' X: O6 e/ g; `systemctl enable firewalld.service
! W4 f6 L, A/ B, _. B: a添加规则:
2 `1 y/ F0 Q# `& l. ^ firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="10.161.53.6" port protocol="tcp" port="5900-6000" accept"
( s! V5 p& e: A: W: V( f4 x' W firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="10.161.53.100" port protocol="tcp" port="5900-6000" accept"" Q5 `9 H- s& [2 W3 C o
firewall-cmd --reload
# [8 C P4 j. a, H firewall-cmd --list-all% k+ U7 ?/ I8 Y5 R# B9 G
删除规则:
; I l4 J9 @% w5 b* R firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="10.161.53.6" port protocol="tcp" port="5900-6000" accept"6 n' v: D" W6 g
( P' P4 B1 x' T1 ~+ i firewall-cmd --reload 1 t+ [2 v$ Q+ j! k
firewall-cmd --list-all
2 C2 x* d$ ]: `8 H. _/ ?7 O' _
1 b8 F- ~! a6 Q: X. z" N- c6 \' |: p' [% ]% O5 V" q+ C+ V( K
添加防火墙规则:* `& |5 S. T, x, y$ X9 I
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="10.161.53.31/27" port protocol="tcp" port="5900-6000" accept" B1 m2 Y2 z9 `* U
* V8 K; m. F# ?2 X' P c9 ~ Sfirewall-cmd --reload 9 N& p6 X( E6 t, D/ V! l# Y
( K7 f$ I. m- S6 @7 a* g- l0 Q w/ i
通过测试上面开启的firewalld会导致业务无法访问。( e# y, h* t8 \6 r
这里改变方式使用iptables的规则吧:
- f [0 K9 ]7 q+ H1 u$ [2 r+ e# \) a+ X5 ?# z G# z
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
1 Z6 K, z) P' ^* j5 l4 ~ iptables -L' _% p b$ W, P+ R& r
iptables -A INPUT -p tcp -m multiport --dports 5900:5999 -j REJECT --reject-with icmp-port-unreachable
5 d% z$ M7 v5 T" m: ^
" Q2 O6 j6 F/ B7 J, a1 i- t) [6 @1 n
8 x9 ~9 a0 l8 i( N0 v9 W
|
|