开源SDP 软件定义边界环境的安装和搭建

一、前言

现在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

  1. 网关要配置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
执行完脚本后应该是这样
在这里插入图片描述

  1. 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

  1. 从源代码的目录中拷贝fwknopd.conf 和 gate_sdp_ctrl_client.conf 到/etc/fwknop中,fwknopd.conf 中修改:DP_CTRL_CLIENT_CONF 就是gate_sdp_ctrl_client配置文件的地址 ,PCAP_INTF 网卡的别名 用ifconfig查,还有最下面的Direcories 我把能开的全开了,也不知道有没有用。
  2. gate_sdp_ctrl_client中修改:CTRL_ADDR 也就是控制器的IP ,然后就是控制器生成的 KEY_FILE 、CERT_FILE 、 CA_CERT_FILE , SPA_KEY和SPA_HMAC_KEY可以随便填,按道理应该和控制器spdid表中的数据一致,但是这个我随便填他也能生效,这应该是个bug。我的client中这个文件的字段是随着数据库一起变动的,没连接一次控制器这个东西就会更新。就这个地方弄了好久没整明白。
  3. sudo fwknopd,启动网关。

这个网关的难点就是iptables的使用和配置文件的修改吧!

建议:客户端的debug日志通过 cat /etc/log/syslog |grep sdp 和 fwk 来看,这个东西debug日志写入了系统的syslog

3、SDP client

client也照文档编译安装,这个玩意和gateway是同一个代码,是Waverley Labs公司在开源fwknop上做的二次开发来适应sdp,没什么难点。难点是配置文件的编写。

  1. 和上面的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

  1. 从源代码的client中拷贝the files SAMPLE.fwknoprc and SAMPLE_sdp_ctrl_client.conf to the user’s home directory. Rename SAMPLE.fwknoprc to .fwknoprc.
  2. .fwknoprc文件只需要填写sercice_gate 这个,其余的都删除,sdp_id 1 ,allow_ip 就是客户端的ip
    SPA_SERVER 就是 gateway的IP ,SDP_CTRL_CLIENT_CONF 改成对应的。其余的不要改他。
  3. SAMPLE_sdp_ctrl_client 这个和gateway的那个差不多,改CTRL_ADDR,有个VERBOSITY
    挺有用的改成7能看debug信息,我的报错就是改这个看的,等下他会将debug信息写到cmd上,直接能看debug信息。改KEY_FILE
    CERT_FILE CA_CERT_FILE / SPA KEY 和 HMAC key 不用改他,等下敲命令他会自动变。
  4. 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的门。

参考连接:

  1. https://github.com/WaverleyLabs/fwknop/blob/master/Waverley%20Labs%20OpenSDP%20Installation%20and%20Configuration.pdf
  2. https://blog.csdn.net/majipeng19950610/article/details/84796461
  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
7.2软件开发计划(SDP)的免费意味着该计划可供免费使用,而且不需要任何付费。 在软件开发领域,SDP是指为了成功开发软件而制定的一项计划。它包含了项目的目标、范围、资源需求、进度安排、风险评估等方面的信息。SDP的目的是确保开发团队能够规划并有效地实施软件开发项目。 当7.2版本的软件开发计划被标记为免费时,这意味着使用该计划的个人、团队或组织可以免费获得并使用该计划,无需支付任何费用。这对于那些想要开发软件但没有足够的资金来购买商业计划模板或聘请专业人士来编制计划的人们来说是非常有利的。 以免费的7.2软件开发计划为基础,开发团队可以根据自己的需求和项目的特点来制定具体的开发计划。他们可以使用计划中的模板和指南,定义项目的目标和范围、分配资源、确定进度安排,并评估可能的风险。 免费的SDP为开发团队提供了一个有组织和系统化的方法,使他们能够在开发软件项目时更加高效和成功。它可以帮助团队避免常见的错误和风险,并提供了一个基本的框架,以确保项目按时交付、满足客户需求并达到预期的质量标准。 总之,7.2软件开发计划的免费意味着任何人都可以免费获取并使用该计划,这为有限资金的个人、团队或组织提供了一个有效和可靠的工具,以规划和实施他们的软件开发项目。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值