安全


概要

API Endpoint 安全/认证和授权

Speedle API Endpoint 自身仅支持 TLS mutual auth(TLS 相互身份验证)这种认证和授权.

您可以使用像 Ambassador API Gateway 等既存的方案对 Speedle API endpoint 进行保护。

消息安全 / TLS

TLS 是一种提供通信安全性的加密协议,它提供了许多不同的交换密钥进行身份验证,加密数据和保证消息完整性的方法。

Speedle 支持使用 TLS 来保护在非信任环境中的消息传输,也支持使用 TLS mutual auth 来验证客户端身份。

在下文中,我们将介绍如何在 Speedle(作为一个独立应用程序)中启用 TLS,以及如何使用 Speedle CLI / curl 访问启用 TLS 的 Speedle 服务。

如果您希望通过 TLS 保护在 Kubernetes 中的 Speedle 部署,请单击 此处

先决条件

为了启用 TLS,Speedle 必须为其外部接口(IP 地址或 DNS 名称)配置相关的“证书”,以接受安全连接。

此证书由受信任的第三方(证书颁发机构)加密签名。要获取签名证书,您需要选择 CA 并按照所选 CA 提供的说明获取证书。

在测试环境中,可以创建一个“自签名”证书。自签名证书是未经知名 CA 签名的用户自己生成的证书,无法保证证书的真实性,因此它们不适合在生产环境中使用。

为方便起见,您可以使用 cfssl 工具来生成自签名证书,步骤如下:

安装 cfssl

curl -s -L -o /usr/bin/cfssl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
curl -s -L -o /usr/bin/cfssljson https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64

或者使用 Go 来安装:

go get -u github.com/cloudflare/cfssl/cmd/cfssl
go get -u github.com/cloudflare/cfssl/cmd/cfssljson

生成 CA 和证书

echo '{"CN":"CA","key":{"algo":"rsa","size":2048}}' | cfssl gencert -initca - | cfssljson -bare ca -
echo '{"signing":{"default":{"expiry":"43800h","usages":["signing","key encipherment","server auth","client auth"]}}}' > ca-config.json
# replace this with your ip address or dns
export ADDRESS=localhost,127.0.0.1
export NAME=server
echo '{"CN":"'$NAME'","hosts":[""],"key":{"algo":"rsa","size":2048}}' | cfssl gencert -config=ca-config.json -ca=ca.pem -ca-key=ca-key.pem -hostname="$ADDRESS" - | cfssljson -bare $NAME
export ADDRESS=
export NAME=client
echo '{"CN":"'$NAME'","hosts":[""],"key":{"algo":"rsa","size":2048}}' | cfssl gencert -config=ca-config.json -ca=ca.pem -ca-key=ca-key.pem -hostname="$ADDRESS" - | cfssljson -bare $NAME

mv server.pem server.crt
mv server-key.pem server.key
cp ca.pem server-ca.crt

mv client.pem client.crt
mv client-key.pem client.key
cp ca.pem client-ca.crt

在 Speedle 中启用 TLS

命令行参数

Speedle PMS(Policy Management Service)和ADS(Authorization Decision Service)的 TLS 相关配置参数:

名称 默认 注释
insecure true, false false 指定是否为非安全方式, true: 禁用, false: 启用。
cert TLS certificate path 指定 TLS 证书文件的目录。
key TLS private key path 指定 TLS 私钥文件的目录。
client-cert client CA path 指定用于客户端认证的 CA 证书的目录。
force-client-cert true, false false 指定是否强制客户端证书认证。

示例

$ speedle-pms --store-type file --endpoint="127.0.0.1:6733" --insecure=false --key=$tls_config_path/server.key --cert=$tls_config_path/server.crt --client-cert=$tls_config_path/client-ca.crt

$ speedle-ads --store-type file --endpoint="127.0.0.1:6735" --insecure=false --force-client-cert=true --key=$tls_config_path/server.key --cert=$tls_config_path/server.crt --client-cert=$tls_config_path/client-ca.crt

注意: 请在指定 TLS 相关目录时使用绝对目录。

使用spctl CLI 访问启用 TLS 的 Speedle

命令行参数

Spctl CLI TLS 相关配置参数:

名称 默认 注释
skipverify true, false false 指定是否跳过 Speedle 的 TLS 证书校验 certificate.
cert TLS certificate path 指定客户端 TLS 证书的目录。
key TLS private key path 指定客户端 TLS 私钥的目录。
client-cert client CA path 指定 CA 证书的目录。
force-client-cert true, false false specifies if the client certificate authentication is forced or not.

示例

$ spctl config skipverify false cacert $tls_config_path/server-ca.crt cert $tls_config_path/client.crt key $tls_config_path/client.key pms-endpoint "https://localhost:6733/policy-mgmt/v1/"
$ spctl create service test
$ spctl get service --all

使用curl访问启用 TLS 的 Speedle

示例

$ curl --cacert $tls_config_path/server-ca.crt --cert $tls_config_path/client.crt --key $tls_config_path/client.key https://localhost:6733/policy-mgmt/v1/service