- 积分
- 16840
在线时间 小时
最后登录1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
关于openstack中虚拟机VNC访问安全问题; _3 X1 b7 j$ C B9 V4 n
前几天收到甲方给出的文件信息,线上OpenStack环境的物理机VNC端口能够自由访问,要求整改。
1 x, z: w- c# B2 i7 o. Y) g2 I( ^随机抽查了两台宿主机的VNC端口,确实很多业务的同学使用noVNC后没有退出终端的习惯,往往都是用完了就直接关闭窗口。不得不说这样隐患很大啊,首先不说通过外部方式规避风险,如果内网里面有一些script kiddie随时都能将我们线上的虚拟机VNC端口扫出来干些坏事。我这里也用过nmap测试了下开发环境的网络端口,如下:
5 S% S0 B4 y' ^ c[root@controller1 ~]# nmap 10.161.53.1
$ S0 n! f* @6 I" d& q2 x- N/ ]! }* g4 zStarting Nmap 6.40 ( http://nmap.org ) at 2022-01-17 09:46 CST+ Y6 T( ~. v& B; ?3 y, [# C
Nmap scan report for compute10 (10.161.53.1), `( s: z5 s. ~8 {1 B. l j& W' }1 E4 x9 q
Host is up (0.000080s latency).
; W: V. f: \; p4 [# _Not shown: 989 closed ports! S# I2 T4 I( O( u. t+ O
PORT STATE SERVICE
/ J$ ^/ q: j& a: N! a22/tcp open ssh
! {! z( }/ W5 A* s0 t4 J; g5900/tcp open vnc, X9 N0 V% z3 ]1 s9 R7 a
5901/tcp open vnc-1, z$ e: K3 b! L7 O8 m* e% i
5902/tcp open vnc-2
- V+ M! i8 k' b1 o& v: Z5903/tcp open vnc-3
K) E# w; V; K& I6 E6 I" N5904/tcp open unknown
6 ~3 | Q5 K/ L9 @ E8 z5906/tcp open unknown
; d- R J$ C7 p+ x) w; T, W5907/tcp open unknown
+ `+ F- W- @3 `+ M3 j" R$ O: q; i5910/tcp open cm
0 v+ d/ `" o/ B( \ c" d5911/tcp open cpdlc
+ m7 u( H5 L; d8 I: g7 y8022/tcp open oa-system4 |$ U& Y5 a5 k" E4 |& j" L
MAC Address: D4:5D:64:08:45:02 (Unknown)* z4 n# I) D/ l- | P" n6 T
Nmap done: 1 IP address (1 host up) scanned in 1.65 seconds
! [) j5 r: j: `. `0 j1 m' M4 _[root@controller1 ~]# nmap 10.161.53.2
' d! C: H" L# E# hStarting Nmap 6.40 ( http://nmap.org ) at 2022-01-17 09:46 CST( X( g1 b8 m; ~+ I7 X* _
Nmap scan report for compute11 (10.161.53.2)
/ x: M! Q5 I/ F% h0 H( mHost is up (0.000070s latency).. u) Q d$ l% b- t X. l" l! j; \
Not shown: 989 closed ports- z" X- |9 O, Z T8 q# O8 v9 [
PORT STATE SERVICE
# B& T' m( ~3 S$ A7 N$ P22/tcp open ssh0 W/ w4 a) X9 o( E7 f+ s
5900/tcp open vnc( V+ `; N/ Y7 F! U
5901/tcp open vnc-1
' ?" F/ [" ]8 R$ a, X# N/ k: t5902/tcp open vnc-2+ ]+ k6 e% T$ H% k. q* T" j7 W/ ~
5903/tcp open vnc-3" M' p1 |( z. V/ k
5904/tcp open unknown
8 v' G: l W; C$ e) _# l) W5906/tcp open unknown
: H8 e- W3 C3 t6 o) X( e9 y! V8 J5907/tcp open unknown* }: J& u: w) c9 O- M
5911/tcp open cpdlc- e, r0 Z7 v6 J; m
5915/tcp open unknown% y% u5 h6 E; r* Q- k2 H, L
8022/tcp open oa-system; t- A) n; b# n* H
MAC Address: D4:5D:64:07:B3:DA (Unknown)
: s& ?1 C6 r! [# V7 CNmap done: 1 IP address (1 host up) scanned in 1.67 seconds
9 K; O# j( F: O1 Y" M( c[root@controller1 ~]# nmap 10.161.53.3. A$ {+ C& X7 J0 z
Starting Nmap 6.40 ( http://nmap.org ) at 2022-01-17 09:46 CST8 ]. X) e$ k% n3 ~ C, s% s
Nmap scan report for compute01 (10.161.53.3)4 ]/ C6 E9 Q7 t- J
Host is up (0.000076s latency).* h w: d+ L; n% U7 y! k
Not shown: 992 closed ports
. w* I8 V! q+ o1 ^$ {- W# rPORT STATE SERVICE7 ^0 `! N* U0 _2 }2 L
22/tcp open ssh
3 [) G* o; `+ a# H, Y. h5900/tcp open vnc" L5 i" U- [8 `; d7 p0 G0 q, E
5901/tcp open vnc-1
; W# u+ ?( y& w5902/tcp open vnc-2
# F" |0 M9 i) x. Y! Z8 q# z5903/tcp open vnc-3
8 m [) q2 x1 h/ a$ W5904/tcp open unknown) \: M h$ x# u
5906/tcp open unknown& N7 T( J2 h% C3 m3 l7 U. v
8022/tcp open oa-system# b, U9 s. g3 `/ m
MAC Address: D4:5D:64:08:45:5E (Unknown)
: l/ P; g) ]+ l S9 E9 H% b4 Q: @Nmap done: 1 IP address (1 host up) scanned in 1.68 seconds
' o8 | I% @1 ^2 g u# q[root@controller1 ~]# nmap 10.161.53.4
. |4 [+ R/ |- w( H1 j2 m/ EStarting Nmap 6.40 ( http://nmap.org ) at 2022-01-17 09:46 CST# Y1 w0 x2 M, O$ Y4 p8 \/ H! w
Nmap scan report for compute02 (10.161.53.4)* v. \4 j7 |9 E- J
Host is up (0.000081s latency).
' Q! x* K- Q7 @Not shown: 988 closed ports
, w1 g0 X0 G. e1 ePORT STATE SERVICE: m$ y# Z% u- g2 l, C
22/tcp open ssh
" } x7 p4 @' Z: O( g3 J f" c5900/tcp open vnc4 L% ^- v3 {: x; p5 x" g! p6 m
5901/tcp open vnc-14 f7 O1 V3 J1 e6 m7 y
5902/tcp open vnc-2; E5 O/ w# F, l* C$ |" Y: }- P
5903/tcp open vnc-3
% w( t& }! [6 f. |8 e. m9 i1 g5904/tcp open unknown
2 t5 N9 Y# d* i! y+ i5906/tcp open unknown
+ P! y- y% b3 @1 N5907/tcp open unknown
1 d U+ b% R0 C/ f6 F& z& ^5910/tcp open cm
6 E& c# R: r" z5911/tcp open cpdlc
' D* U$ C8 f/ b& c5915/tcp open unknown
; o0 N; N; Q% H( x4 {# y" O1 z8022/tcp open oa-system$ r3 r! P3 u" s* a' Q9 f2 S" z
MAC Address: D4:5D:64:08:45:D6 (Unknown)
, G5 `$ b6 h1 X4 \/ pNmap done: 1 IP address (1 host up) scanned in 1.67 seconds) h: b5 ?# q) d% B
[root@controller1 ~]# nmap 10.161.53.5* h( d* g1 o7 Y* M
Starting Nmap 6.40 ( http://nmap.org ) at 2022-01-17 09:47 CST
& u, f- k+ @0 \7 W8 B2 ZNmap scan report for compute03 (10.161.53.5)7 o I5 m5 R6 z* H( H
Host is up (0.000082s latency).
3 L5 z; d; j4 j! @; ZNot shown: 993 closed ports
1 Q. I8 ?# Z& v- C. R% a; |PORT STATE SERVICE& K; z; T! k1 `/ v6 l0 R0 x
22/tcp open ssh! ?# O8 s# H0 `$ u$ D8 [+ H
5900/tcp open vnc" V/ X h. L- z5 A8 c4 o
5901/tcp open vnc-1' C/ ~0 G( V4 l, b
5902/tcp open vnc-2! O+ c: o3 i0 F* A/ D k' w
5903/tcp open vnc-3
- d u0 }/ ?* i5 B" G8 U2 h- X5 S5904/tcp open unknown& H& e' n7 l. o/ }( L
8022/tcp open oa-system5 @4 ?8 a/ Z2 X# v" G; \4 _
MAC Address: D4:5D:64:08:44:DE (Unknown); Q" z/ H, F+ h% w8 O+ @, W/ |
Nmap done: 1 IP address (1 host up) scanned in 1.67 seconds
, Q0 x0 H6 w; H1 H; {8 `9 q[root@controller1 ~]# nmap 10.161.53.6 [/ I6 C. N2 b0 M
Starting Nmap 6.40 ( http://nmap.org ) at 2022-01-17 09:47 CST
/ V' q- b9 \6 [1 Z) ?' X3 E. f/ ~Nmap scan report for controller1 (10.161.53.6)5 q8 s9 t' F" w' h0 y g4 H& Z1 ~' M" n
Host is up (0.000014s latency).& k. V9 X8 G& U
Not shown: 992 closed ports0 T |/ N6 Y4 J& P
PORT STATE SERVICE k, e1 P; m$ O0 W" O# U, {8 h* H* p5 c
22/tcp open ssh
! }2 A+ D r; T7 [0 K80/tcp open http2 S# I( W9 W& n& d5 j Z, I, j
1984/tcp open bigbrother9 o _" |! W8 x$ b2 J
3306/tcp open mysql
$ w" r* c7 u! e" g4000/tcp filtered remoteanything
% O7 A5 U" D5 ~) C( b2 ]: X4567/tcp open tram- Q( }+ n* c; _/ j5 d
5000/tcp open upnp7 d5 s X% ~, | @2 y" N' i0 \0 W
5001/tcp open commplex-link
$ V+ E% C g4 q+ o8 r" g: Q/ ANmap done: 1 IP address (1 host up) scanned in 2.75 seconds
: }2 z5 ?: ~, M1 L2 T" K* z1 W[root@controller1 ~]# nmap 10.161.53.7
2 ~& W+ Q1 @6 L2 QStarting Nmap 6.40 ( http://nmap.org ) at 2022-01-17 09:47 CST
6 I+ S6 E7 Z5 g3 _1 \4 QNmap scan report for controller2 (10.161.53.7)
0 ]+ |" Q0 ]+ G' z2 m6 f, aHost is up (0.000078s latency).+ c: ^, r+ f- d$ ?, K5 `
Not shown: 993 closed ports( e" g) V4 @+ Z# W% B; M
PORT STATE SERVICE
; w0 d. v& ]) S+ v4 A% z8 m22/tcp open ssh
) K5 e: u+ X1 j. }# p9 M80/tcp open http# h8 z! {+ w0 o- r- m6 @
1984/tcp open bigbrother* J/ d8 _; `- u# ~
3306/tcp open mysql
8 u5 s; p5 s i) H4567/tcp open tram
" f1 [: e6 x; ?2 q5000/tcp open upnp2 H4 @( r+ ~2 k, T' m
5001/tcp open commplex-link
/ ]" Q; y8 I( f6 H2 p; ^MAC Address: D4:5D:64:08:45:0A (Unknown)
6 a) r ~7 C7 iNmap done: 1 IP address (1 host up) scanned in 1.55 seconds8 P- ? U& V7 V/ |
2 }& g0 v, ?. o结果太恐怖了吧,如果有业务同学在使用noVNC之后没有退出终端,那么另一个人如果知道了宿主机的IP和端口是完全可以登录这台虚拟机的,直接操作虚机,后果不堪设想:
4 A) D% o7 L& Q5 s- L9 r+ N4 s; f7 j% |' y6 M7 N0 ?, M
解决
# [) b4 t2 H3 v# m知道了问题,那就有对应的解决方案!8 n. D; p* L$ O% i$ x6 M
目前我们暂时只想到两个方法来解决这个问题,其他方法还有待大牛给予指导:, J0 b, `" }% A) r C8 D
. j( P' v: [7 [1 c1 Z& D `方案一1 d: r. U+ v! }$ u7 @
通过firewalld限制INPUT表对5900:6000的访问规则, J0 ~! {8 w' q) _/ ?9 o& o
方案二
2 d, N3 l, Z ^; q添加密码访问VNC& q6 |$ x' P* Q [) E. }! R
( U% h% n! B* |7 R0 j; C操作1 a# ^' }2 m; w" }3 i
firewalld
8 c3 T3 V3 ~; j! j3 n我们知道OpenStack通过VNC Proxy将管理网和业务网隔离开来,以便我们可以使用管理网络的6080端口访问虚拟机VNC,同时提供Token用于验证访问的合法性。一个VNC Proxy在OpenStack里的处理流程如下:
- R8 E% [1 L4 i4 e- U9 ]0 Z2 OVNC Porxy处理流程& k a4 s7 Y+ _8 a
1. 一个用户试图从浏览器里面打开连接到虚拟机的VNC Client- W( V; y) S5 F ~
2. 浏览器向nova-api发送请求,要求返回访问vnc的url' a" F" q3 M' B J5 G9 I. [
3. nova-api调用nova-compute的get vnc console方法,要求返回连接VNC的信息 n7 u2 {3 `3 V
4.nova-compute调用libvirt的get vnc console函数
2 h( m0 h( r7 v/ ]5.libvirt会通过解析虚拟机运行的/etc/libvirt/qemu/instance-0000000c.xml文件来获得VNC Server的信息5 ?7 g$ i: ]9 _
6.libvirt将host, port等信息以json格式返回给nova-compute0 A. G7 P0 K( K& B
7.nova-compute会随机生成一个UUID作为Token7 B I0 H9 x) e4 n8 b- E, x0 Z) q
8.nova-compute将libvirt返回的信息以及配置文件中的信息综合成connect_info返回给nova-api
~6 u& _3 k; p% A9.nova-api会调用nova-consoleauth的authorize_console函数/ G/ T0 G: _! M
10.nova-consoleauth会将instance –> token, token –> connect_info的信息cache起来$ y$ @7 w& Z$ _5 c
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
( E1 z* c3 [ `1 l) I+ ?1 O12.浏览器会试图打开这个链接9 e' X& |) `' C% y; L3 `5 S3 m
13.这个链接会将请求发送给nova-novncproxy6 ~$ {' d4 c( w0 x2 c
14.nova-novncproxy调用nova-consoleauth的check_token函数
0 _/ i( @2 P; z( [0 _* F15.nova-consoleauth验证了这个token,将这个instance对应的connect_info返回给nova-novncproxy
5 u- J' }# |2 W1 {" U* n! r16.nova-novncproxy通过connect_info中的host, port等信息,连接compute节点上的VNC Server,从而开始了proxy的工作
3 R ~% u! q/ Y2 j' Z8 h这里重要的就是第16步, nova-novncproxy是通过连接host:vncport的方式提供vnc访问服务。5 o' b4 |4 c5 p$ \# c0 g! ]) g
那么也就是说,计算节点的VNC端口只需要让nova-novncporxy服务能够访问就行,有了这个就好办了。$ u+ f3 V: Y6 [- c
操作firewalld
* `) b: c# B/ C1 {2 t# ]* [在所有计算节点firewalld的INPUT表中添加如下规则:
# k0 l5 H( C# _/ a. k' `) C* p% y8 [0 @7 c9 A5 f/ B! s
检查防火墙是否启动:
! d6 ^8 r3 t" e: ]( P% H+ ^2 \systemctl status firewalld.service
0 _' ]6 C: \) b9 c, {启动防火墙:5 R( E% W0 u# S, c3 _3 C* i6 _
systemctl start firewalld.service
: r) Y4 A/ K6 w3 U2 Z1 Y6 _; o
0 I6 `3 n' T" Z- U1 A0 i: X% s4 v4 Y1 |( P1 a' _0 _; G
开机启动防火墙:7 {. e" N& N/ x4 d5 }4 _6 t2 d, J
systemctl enable firewalld.service
1 o' l) `1 Z! b0 d: z添加规则:9 y- r5 f: I+ n' m( W& m' p
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="10.161.53.6" port protocol="tcp" port="5900-6000" accept"
4 a- t+ A# l' e( g5 r firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="10.161.53.100" port protocol="tcp" port="5900-6000" accept": A3 p7 f8 _& G d( w) t
firewall-cmd --reload
4 r! L% ^! S+ B' t! {9 v1 [, E' o firewall-cmd --list-all
, r7 p S9 x l" }2 ]- o删除规则:& N1 ~5 R+ v; }: T0 ^8 K
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="10.161.53.6" port protocol="tcp" port="5900-6000" accept"
5 X( k4 w+ D+ x& K2 @: |2 \4 f; \
firewall-cmd --reload 5 C# O3 N' \" y
firewall-cmd --list-all
' X5 F ~8 O# `
( N# J: p5 E" {6 p2 c P6 v$ ^; S
添加防火墙规则:" I0 [8 |2 z( l( t- q
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="10.161.53.31/27" port protocol="tcp" port="5900-6000" accept"
! C r% q8 z( Q4 K# T& S2 e( g& d0 I0 [7 {
firewall-cmd --reload
! k: l# n' q/ p/ { Q8 Y% d# I2 ^! v4 @0 P
通过测试上面开启的firewalld会导致业务无法访问。
9 A6 R% b8 `8 i; a s: o- v5 @这里改变方式使用iptables的规则吧:6 w. T- M8 ^/ ~5 ~! n: \8 b
* t% ?+ o) V' l6 f/ K
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" [$ a4 a9 f! f2 e% D' f+ O! X( \
iptables -L; M) K+ ], ?0 m
iptables -A INPUT -p tcp -m multiport --dports 5900:5999 -j REJECT --reject-with icmp-port-unreachable, h4 W; U1 O( k, X5 R; G6 s4 k! @# ]
5 H! \8 S% t$ m" _; s' v5 S7 h- }! h8 S( K
& F1 ^3 U) F" ^2 ]( b9 h |
|