概述
搭建Waverley Labs的开源sdp项目
- 一、前言
- 二、架构
- 三、环境搭建
- 1、SDP controller
- 2、SDP gateway
- 3、SDP client
- 三、最后
- 参考连接:
一、前言
现在Software Defined Perimeter(sdp)的概念越来越火,Waverley Labs的开源sdp项目是目前开源sdp的主流。因为在搭建环境的过程中,安装文档过于简单系统也有小bug,国内外的这方面资料很少且介绍的不详细,概念很新没有很多人实践过,基于这种种原因,所以在搭环境的走了很多弯路,所以想写这篇文章,供后面从事此方向的同学参考。
二、架构
我搭建的方案用了三台虚拟机:分别是客户端,控制器,和网关。**因为sdp controller没有配iptables的默认丢弃策略,按sdp的概念来说应该在控制器前面再配一个网关来阻止其他服务攻击sdp控制器的。为了简单起见我现在搭建的是最简单的方案。**加密方法我搭建时选的是对称加密,开源方案使用的是Rijndael+HMAC的方式,所有组件通信的方式使用了ssl协议。
主要逻辑就是client 执行fwknop -n后,client先发送一个spa敲门包,然后从控制器读取下一次敲门所需的spakey和HMAC保存到本地配置文件中,控制器同步更新这两个秘钥到gateway。client下次敲门时会利用这次获取的spakey和HMAC.
三、环境搭建
提示:参考Waverley Labs Open Source Software Defined Perimeter Installation and Configuration
我的sdp controller 在ubuntu 20.04上搭建的,gateway和client在ubuntu 18上搭建的
我是在gateway上面开了个sshd服务默认22端口,client敲门,并访问gateway的ssh服务。
1、SDP controller
1、安装node.js环境。
2、安装npm
这两部很基础自行百度
3、git clone SDP Controller
4、npm安装依赖
5、安装mysql
6、将sdp.sql导入mysql
7、填写mysql中4个表的数据。sdpid,service,service_gateway ,sdpid_service
spdid 包括client、controller、gateway encrypt_key 和hmac_key不用填,后面会自动生成
这代表这个服务有哪些功能权限,比如第一条的意思就是服务2代表spdid为3的组件(我的是网关)开tcp的22端口。
权限表,授予spdid为1(我的是client)能够访问服务2的权限。即开tcp的22端口
列举有哪些服务
8、编辑 .config.js ,里面有数据库的账号密码啥的要配置,还有一个serverCert /serverKey 这个server指的就是controller,还有个caCert和caKey 这些的默认地址不对,看着改。
9、安装ssl
10、openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:4096 -keyout ca.key -out ca.crt
这个会生成自签名证书,crt 和私钥key,这个ca.crt也要拷到每个机器中,注意:这条指令可能会报错,自行百度,少了个生成秘钥的种子数,得加一个参数使用默认的种子数。
11、node ./genCr edentials.js SDPID 这个sdpid就是spdid表中的id,要给每个东西都执行一次此命令,他会生成三个文件.crt .key 还有一个spa啥的 没用,crt 和key 要拷到对应的组件机器中,到时候配置文件中会填写。
这的两步是为了OpenSSL通信准备的,因为sdp的通信是通过ssl的方式,ssl需要ca证书和该证书签名的部件证书和私钥。这玩意我也不太懂,因为我不是搞密码的,大概是这个意思。
12、启动sdp 控制器。node ./sdpController.js,控制器默认会在5000上开个监听端口。
这个玩意的难点就是数据库填写,和ssl。
2、SDP gateway
- 网关要配置iptables,默认drop策略
我这有份脚本可以用
IPTABLES=/sbin/iptables
IP6TABLES=/sbin/ip6tables
MODPROBE=/sbin/modprobe
INT_NET=192.168.10.0/24 //按实际改
INT_INTF=eth1 //按实际改
EXT_INTF=eth0 //按实际改
### flush existing rules and set chain policy setting to DROP
echo "[+] Flushing existing iptables rules..."
$IPTABLES -F
$IPTABLES -F -t nat
$IPTABLES -X
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
### this policy does not handle IPv6 traffic except to drop it.
#
echo "[+] Disabling IPv6 traffic..."
$IP6TABLES -P INPUT DROP
$IP6TABLES -P OUTPUT DROP
$IP6TABLES -P FORWARD DROP
### load connection-tracking modules
#
$MODPROBE ip_conntrack
$MODPROBE iptable_nat
$MODPROBE ip_conntrack_ftp
$MODPROBE ip_nat_ftp
###### INPUT chain ######
#
echo "[+] Setting up INPUT chain..."
### state tracking rules
$IPTABLES -A INPUT -m conntrack --ctstate INVALID -j LOG --log-prefix "DROP INVALID " --log-ip-options --log-tcp-options
$IPTABLES -A INPUT -m conntrack --ctstate INVALID -j DROP
$IPTABLES -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
### anti-spoofing rules
$IPTABLES -A INPUT -i $INT_INTF ! -s $INT_NET -j LOG --log-prefix "SPOOFED PKT "
$IPTABLES -A INPUT -i $INT_INTF ! -s $INT_NET -j DROP
### ACCEPT rules
$IPTABLES -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
### default INPUT LOG rule
$IPTABLES -A INPUT ! -i lo -j LOG --log-prefix "DROP " --log-ip-options --log-tcp-options
### make sure that loopback traffic is accepted
$IPTABLES -A INPUT -i lo -j ACCEPT
###### OUTPUT chain ######
#
echo "[+] Setting up OUTPUT chain..."
### state tracking rules
$IPTABLES -A OUTPUT -m conntrack --ctstate INVALID -j LOG --log-prefix "DROP INVALID " --log-ip-options --log-tcp-options
$IPTABLES -A OUTPUT -m conntrack --ctstate INVALID -j DROP
$IPTABLES -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
### ACCEPT rules for allowing connections out
$IPTABLES -A OUTPUT -p tcp --dport 21 -m conntrack --ctstate NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 25 -m conntrack --ctstate NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 43 -m conntrack --ctstate NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 4321 -m conntrack --ctstate NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 53 -m conntrack --ctstate NEW -j ACCEPT
$IPTABLES -A OUTPUT -p udp --dport 53 -m conntrack --ctstate NEW -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
### default OUTPUT LOG rule
$IPTABLES -A OUTPUT ! -o lo -j LOG --log-prefix "DROP " --log-ip-options --log-tcp-options
### make sure that loopback traffic is accepted
$IPTABLES -A OUTPUT -o lo -j ACCEPT
###### FORWARD chain ######
#
echo "[+] Setting up FORWARD chain..."
### state tracking rules
$IPTABLES -A FORWARD -m conntrack --ctstate INVALID -j LOG --log-prefix "DROP INVALID " --log-ip-options --log-tcp-options
$IPTABLES -A FORWARD -m conntrack --ctstate INVALID -j DROP
$IPTABLES -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
### anti-spoofing rules
$IPTABLES -A FORWARD -i $INT_INTF ! -s $INT_NET -j LOG --log-prefix "SPOOFED PKT "
$IPTABLES -A FORWARD -i $INT_INTF ! -s $INT_NET -j DROP
### ACCEPT rules
$IPTABLES -A FORWARD -p tcp -i $INT_INTF -s $INT_NET --dport 21 -m conntrack --ctstate NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp -i $INT_INTF -s $INT_NET --dport 25 -m conntrack --ctstate NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp -i $INT_INTF -s $INT_NET --dport 43 -m conntrack --ctstate NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp -i $INT_INTF -s $INT_NET --dport 4321 -m conntrack --ctstate NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 53 -m conntrack --ctstate NEW -j ACCEPT
$IPTABLES -A FORWARD -p udp --dport 53 -m conntrack --ctstate NEW -j ACCEPT
$IPTABLES -A FORWARD -p icmp --icmp-type echo-request -j ACCEPT
### default LOG rule
$IPTABLES -A FORWARD ! -i lo -j LOG --log-prefix "DROP " --log-ip-options --log-tcp-options
###### NAT rules ######
#
echo "[+] Setting up NAT rules..."
$IPTABLES -t nat -A PREROUTING -p tcp --dport 80 -i $EXT_INTF -j DNAT --to 192.168.10.3:80
$IPTABLES -t nat -A PREROUTING -p tcp --dport 443 -i $EXT_INTF -j DNAT --to 192.168.10.3:443
$IPTABLES -t nat -A PREROUTING -p udp --dport 53 -i $EXT_INTF -j DNAT --to 192.168.10.4:53
$IPTABLES -t nat -A POSTROUTING -s $INT_NET -o $EXT_INTF -j MASQUERADE
###### forwarding ######
#
echo "[+] Enabling IP forwarding..."
echo 1 > /proc/sys/net/ipv4/ip_forward
exit
### EOF ###
这个脚本吧ICMP留下来了,还能使用ping命令
查看iptables的命令是 sudo iptables -nL --line-number
执行完脚本后应该是这样
- clone 代码编译安装
git clone https://github.com/waverleylabs/fwknop
sudo apt-get install net-tools openssl libssl-dev libjson-c-dev libpcap-dev texinfo libtool autoconf make telnet libuv1 libuv1-dev
libtoolize --force
aclocal
autoheader
automake --force-missing --add-missing
autoconf
./configure --prefix=/usr --sysconfdir=/etc --with-iptables=/sbin/iptables //注意iptables的位置
make
sudo make install
- 从源代码的目录中拷贝fwknopd.conf 和 gate_sdp_ctrl_client.conf 到/etc/fwknop中,fwknopd.conf 中修改:DP_CTRL_CLIENT_CONF 就是gate_sdp_ctrl_client配置文件的地址 ,PCAP_INTF 网卡的别名 用ifconfig查,还有最下面的Direcories 我把能开的全开了,也不知道有没有用。
- gate_sdp_ctrl_client中修改:CTRL_ADDR 也就是控制器的IP ,然后就是控制器生成的 KEY_FILE 、CERT_FILE 、 CA_CERT_FILE , SPA_KEY和SPA_HMAC_KEY可以随便填,按道理应该和控制器spdid表中的数据一致,但是这个我随便填他也能生效,这应该是个bug。我的client中这个文件的字段是随着数据库一起变动的,没连接一次控制器这个东西就会更新。就这个地方弄了好久没整明白。
- sudo fwknopd,启动网关。
这个网关的难点就是iptables的使用和配置文件的修改吧!
建议:客户端的debug日志通过 cat /etc/log/syslog |grep sdp 和 fwk 来看,这个东西debug日志写入了系统的syslog
3、SDP client
client也照文档编译安装,这个玩意和gateway是同一个代码,是Waverley Labs公司在开源fwknop上做的二次开发来适应sdp,没什么难点。难点是配置文件的编写。
- 和上面的gateway一样git clone,安装依赖,编译安装。
git clone https://github.com/waverleylabs/fwknop
sudo apt-get install net-tools openssl libssl-dev libjson-c-dev libpcap-dev texinfo libtool autoconf make telnet libuv1 libuv1-dev
libtoolize --force
aclocal
autoheader
automake --force-missing --add-missing
autoconf
./configure --disable-server --prefix=/usr
make
sudo make install
- 从源代码的client中拷贝the files SAMPLE.fwknoprc and SAMPLE_sdp_ctrl_client.conf to the user’s home directory. Rename SAMPLE.fwknoprc to .fwknoprc.
- .fwknoprc文件只需要填写sercice_gate 这个,其余的都删除,sdp_id 1 ,allow_ip 就是客户端的ip
SPA_SERVER 就是 gateway的IP ,SDP_CTRL_CLIENT_CONF 改成对应的。其余的不要改他。 - SAMPLE_sdp_ctrl_client 这个和gateway的那个差不多,改CTRL_ADDR,有个VERBOSITY
挺有用的改成7能看debug信息,我的报错就是改这个看的,等下他会将debug信息写到cmd上,直接能看debug信息。改KEY_FILE
CERT_FILE CA_CERT_FILE / SPA KEY 和 HMAC key 不用改他,等下敲命令他会自动变。 - fwknop -n service_gate 敲门
执行成功后网关会给客户端开一条通道,在gateway机器上查看应该是这样:
客户端敲门成功!!! 可以用ssh连接gateway啦。
这个东西的难点就是改配置文件。我改了半天这个玩意,他的源代码应该有bug,过程挺复杂的,开debug吧,我的SPA_KEY本来是对的他也报错,然后我把他改错,再改回来,他就不报错了。这玩意玄学~~。
主要难题是这个配置文件,SAMPLE_sdp_ctrl_client 的SPA_KEY和SPA_HMAC_KEY ,和.fwknop 的SPA_KEY和SPA_HMAC_KEY每请求完一次会变,他就对了。
三、最后
控制器就是同步更改客户端和网关的SPA_KEY和SPA_HMAC_KEY来达到同步的目的,每次客户端访问就会重新生成,使得客户端下次spa敲门的时候带着这次同步的SPA_KEY和SPA_HMAC_KEY来敲开gateway的门。
参考连接:
- https://github.com/WaverleyLabs/fwknop/blob/master/Waverley%20Labs%20OpenSDP%20Installation%20and%20Configuration.pdf
- https://blog.csdn.net/majipeng19950610/article/details/84796461
最后
以上就是负责金鱼为你收集整理的开源SDP 软件定义边界环境的安装和搭建一、前言二、架构三、环境搭建三、最后参考连接:的全部内容,希望文章能够帮你解决开源SDP 软件定义边界环境的安装和搭建一、前言二、架构三、环境搭建三、最后参考连接:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复