Apache Qpid Broker的安全机制
一、 Apache Qpid的安全机制简介
Apache Qpid提供多种安全机制,包括用户认证、规则定制的授权、消息加密和数字签名等。Apache Qpid使用SASL框架实现对用户身份的认证,使用访问控制列表(ACL)对角色用户的权限进行管理控制,消息加密和数字签名则是使用SSL安全套接字层来实现。
二、 用户认证
AMQP使用SASL(Simple Authentication and Security Layer)对连接到Broker的每一个客户端进行身份认证。SASL是一个安全认证框架,提供多种身份认证方法。在一些对安全性有要求的应用程序中,CRAM-MD5,DIGEST-MD5,GSSAPI这三种属于安全性较高的推荐认证方法。ANONYMOUS匿名方法一般情况都不推荐,因为这是不安全的。PLAIN明文认证只有结合SSL使用,才能得到安全保证。
Apache Qpid Broker和Client是基于Cyrus SASL library。在安全要求较高的场合,要么配置SASL使用CRAM-MD5,DIGEST-MD5或GSSAPI(Kerberos 认证),要么配置SASL PLAIN + SSL。因为如果只用SASL PLAIN的话,系统会很容易遭受中间人攻击的威胁。因此,如果没有使用SSL的话,一般建议禁用PLAIN方法。
Apache Qpid Broker要启用用户认证,需要在配置文件中,把认证的开关打开。
# /usr/local/etc/qpidd/qpidd.conf
#
# Set auth to 'yes' or 'no'
auth=yes
配置SASL
SASL只在Linux系统下使用,windows下是没有的。在CentOS安装Qpid后,SASL配置文件的位置一般是/usr/local/etc/sasl2/qpidd.conf。
SASL数据库包括有用户名和密码,用于SASL认证。每一个用户名都必须要与个域(realm)关联。Apache Qpid默认使用QPID作为域。
Broker的配置文件应该增加域的配置项:
# /usr/local/etc/qpidd/qpidd.conf
#
# Set the SASL realm using 'realm='
auth=yes
realm=QPID
SASL数据库文件一般安装在位置/var/lib/qpidd/qpidd.sasldb。最初数据库文件里配置有初始用户名guest@QPID和密码guest。
为了安全,SASL数据库文件应该只能被系统用户qpidd可读。因为Qpid Broker以驻守进程执行时,一般只使用qpidd用户执行,而且SASL数据库文件保存用户和密码是明文的。因此如果用其他系统用户执行Qpid Broker,SASL数据库文件应该小心配置可见权限,或分开配置。
添加新用户到SASL数据库:
# saslpasswd2 -f /var/lib/qpidd/qpidd.sasldb -u realm new_user_name
列举所有SASL数据库里的用户:
# sasldblistusers2 -f /var/lib/qpidd/qpidd.sasldb
如果使用PLAIN认证方法,则客户端使用对应的用户和密码,即可以成功连接到Broker。如果需要使用更高安全性的认证形式,参考SASL相关文档来配置。
Kerberos
Qpid Broker和Client都是Kerberos server主体,即都是属于Kerberos服务的客户端角色。为了使用Kerberos,Broker 和Client都必须要向Kerberos服务认证。
三、 用户授权
Qpid里使用ACL即访问控制列表,对已认证通过的用户执行一些权限行为控制操作。使用—acl-file使命令加载ACL文件。ACL文件系以.acl为后缀名。
$ qpidd --acl-file ./aclfilename.acl
ACL文件的每一行显示指定授予或拒绝某些用户的行为操作权。如果最后一行是acl deny all all,那说明ACL使用的拒绝模式,只允许明确的用户被授予操作权。
acl allow rajith@QPID all all
acl deny all all
上面例子,用户rajith@QPID可以执行任务操作,其他用户则拒绝。因为ACL默认是拒绝模式的,所以上面的例子可以简化为:
acl allow rajith@QPID all all
另一种配置则是允许模式:
acl allow all all
允许模式跟拒绝模式是相反的,即拒绝该一行以上所指定的用户。允许或拒绝模式必须是ACL文件中的最后一行。
通过ACL的语法可以细化访问控制权限。如:
acl allow carlt@QPID create exchange name=carl.*
acl allow fred@QPID create all
acl allow all consume queue
acl allow all bind exchange
acl deny all all
ACL文件同样可以定义一个用户组,对一个用户组指定权限:
group admin ted@QPID martin@QPID
acl allow admin create all
acl deny all all
ACL也能定义每一个用户的连接数和队列使用配额:
group admin ted@QPID martin@QPID
group blacklist usera@qpid userb@qpid
quota connections 10 admin
quota connections 5 all
quota connections 0 blacklist
quota queues 50 admin
quota queues 5 all
quota queues 1 test@qpid
性能提示:大多数ACL查询并不是经常执行的。在创建队列时,执行的ACL规则决定是否允许或拒绝权限的负载,相对于创建和使用队列是可以忽略不计的。唯一一个比较明显的特殊情况就是发布交换器的查询操作。一个ACL文件如果没有定义发布交换器的规则,那么Broker会就近处理消息发布交换器的ACL查询。然而,如果有发布交换器规则的ACL文件,则Broker就会在每发布任意一条消息时,都会去查询ACL规则。在性能要求苛刻的环境下,一般都组织好exchanges/queue和bindings,提高性能。因此,发布交换器的ACL规则是没有必要的。
ACL语法
(略)
四、 用户连接数和队列配额
连接数限制
对于连接数限制这些设置,ACL里并没有明确指定,而是在Broker启动配置文件里。
--max-connections N
--connection-limit-per-user N
--connection-limit-per-ip N
五、 使用SSL实现加密
加密和证书授权管理,是通过Mozilla's Network Security Services Library (NSS)提供实现。
启用Qpid Broker的SSL
下列选项将在启动SSL Broker时用到
--ssl-cert-db PATH NSS证书库的地址PATH
--ssl-cert-password-file PATH NSS证书库的密码文件PATH
--ssl-cert-name NAME 将使用的证书名
--ssl-port NUMBER 将监听的SSL端口NUMBER,默认为5671
--require-encryption 强制要求Broker只接受加密连接
--listen-disable tcp 关闭对非加密TCP连接的监听
用例:
qpidd --ssl-port 41993 --ssl-cert-db ~/cert/ --ssl-cert-password-file ~/cert/password --ssl-cert-name gxxtest --listen-disable tcp --require-encryption
上述语句启动了一个:
以41993端口作为SSL端口的,
使用~/cert/目录下的NSS证书库的,
使用~/cert/password密码文件打开NSS证书库的,
使用gxxtest作为加密证书的,
不监听TCP连接的,
只接受加密连接的Qpid Broker。
注意,以上语句没有开启任何客户认证的方法。
在Qpid Client上使用SSL连接服务器
下列环境变量需要在启动Linux SSL Client前设置好
QPID_SSL_CERT_PASSWORD_FILE PATH NSS证书库的密码文件PATH
QPID_SSL_CERT_DB PATH NSS证书库的地址PATH
而Windows的Client由于代码实现和Linux的不一样,所以不需要使用NSS,而是使用系统内置的证书管理系统。所以在Windows下使用SSL连接,Broker的证书需要被系统信任。
证书设置好后,只需要在Client程序中,使用Qpid API中Connection类,初始化时将connectionOptions设置为{transport:ssl},连接端口改为服务器SSL端口即可。
以C++ API为例:
std::string connectionOptions = "{transport:ssl}";
Connection connection(broker, connectionOptions);
也可以通过在连接地址前加上“ssl:”前缀,API将会自动识别,如:
std::string broker = "ssl:localhost:5672";
Connection connection(broker, connectionOptions);
服务器CA或其签发机构应被客户端的证书管理系统信任,且连接服务器域名与证书上的认可域名一致,否则不能成功连接。
如果由于调试限制,链接地址无法与证书认可的域名一致,可以在connectionOptions中,增加ssl_ignore_hostname_verification_failure:ture,如:
std::string connectionOptions = "{transport:ssl, ssl_ignore_hostname_verification_failure:ture}";
Connection connection(broker, connectionOptions);
以上步骤都只是进行了对Broker的SSL认证,而没有对客户端进行认证。接下来的步骤将启动针对客户端的SSL认证(SSL client authentication)。
在Broker上启动SSL Client认证
下列选项将在启动Broker时用到
--ssl-require-client-authentication
用例:
qpidd --ssl-port 41993 --ssl-cert-db ~/cert/ --ssl-cert-password-file ~/cert/password --ssl-cert-name gxxtest --listen-disable tcp --require-encryption --ssl-require-client-authentication
以上语句启动了一个比“启用Qpid Broker的SSL”一节中的Broker额外多了要求进行用户SSL认证的Broker。
在Client上启动SSL Client认证
下列环境变量需要在启动Linux Client前设置好
QPID_SSL_CERT_PASSWORD_FILE PATH NSS证书库的密码文件PATH
QPID_SSL_CERT_DB PATH NSS证书库的地址PATH
而在Windows下,用户需要先将自己的证书(拥有私钥)导入到系统内置的证书管理系统中。
为了启用SSL客户端验证,应在Client程序初始化Connection类对象时,在connectionOptions中设置transport:ssl和ssl_cert_name。
用例:
std::string connectionOptions = "{transport:ssl, ssl_cert_name:client2}";
Connection connection(broker, connectionOptions);
上述语句初始化了一个
使用SSL协议传输的,
使用名为client2证书作为客户端验证证书的connection
客户端所使用的证书,应该被Broker所信任。
在Qpid Federation中启动SSL
在Broker间建立连接,需要双方都禁用TCP连接(--listen-disable tcp)才能以SSL端口进行通信。否则会形成一条源Broker:SSL端口=>目的Broker:非SSL端口的连接。
1、使用qpid-route建立Broker间的SSL链接:
qpid-route --transport=ssl link add <dest-broker> <src-broker>
用例:
qpid-route --transport=ssl link add amqps://broker1:41993 amqps://broker2:5671
上述语句建立了一条从broker2:5671到broker1:41993的SSL链接。
注意,因为qpid-route在调用qmf.console 中的BrokerURL类取得Broker的完整地址时,不会将SSL选项传递过去,所以“amqps://”不可省略。否则qpid-route将以非加密协议连接加密端口,出现连接超时失败的情况。
注意,路由是有向的。
2、使用qpid-route建立Broker间的SSL消息路由:
Queue Routes:
qpid-route --transport=ssl queue add <dest-broker> <src-broker> <dest-exchange> <src-queue>
Exchange Routes:
qpid-route --transport=ssl route add <dest-broker> <src-broker> <exchange> <routing-key>
Dynamic Exchange Routes:
qpid-route --transport=ssl dynamic add <dest-broker> <src-broker> <exchange>
用例:
qpid-route --transport=ssl dynamic add amqps://broker1:41993 amqps://broker2:5671 amq.topic
上述语句创建了一条由broker2:5671到broker1:41993的Dynamic Exchange Routes。qpid-route在创建消息路由时,会连带检查并创建链接,所以和创建链接时一样,“amqps://”不可省略。
如果broker采用SSL连接的默认端口号5671,那么端口号可以省略。
3、使用qpid-config/qpid-tool/qpid-route对启动了SSL的Broker进行管理:
用例:
qpid-tool -b amqps://localhost
qpid-config -b amqps://localhost
qpid-route route map amqps://localhost
“amqps://”不可省略。
4、对开启了SSL Client认证的Broker进行管理:
由于qpid-config/qpid-tool/qpid-route是作为Client向Broker发起连接的,所以要配置证书供Broker验证身份。下面给出例子。
qpid-config:
qpid-config --ssl-certificate=/home/chl/ca/client1.crt --ssl-key=/home/chl/ca/client1.key -b amqps://broker3:5673
qpid-route:
qpid-route --transport=ssl --ssl-certificate=/home/chl/ca/client3.crt --ssl-key=/home/chl/ca/client3.key route map amqps://broker1:5671
qpid:tool:
qpid-tool --ssl-certificate=/home/chl/ca/client3.crt --ssl-key=/home/chl/ca/client3.key -b amqps://broker2:5672
“amqps://”不可省略。--ssl-certificate所指定的证书应是被Broker信任的。
Apache Qpid Broker的安全机制的更多相关文章
- Apache Qpid Broker云
一. 什么是Broker云 Apathe Qpid 支持Broker Federation ,也就是Broker联盟或者叫做Broker云.Broker Federation可以通过配置消息路 ...
- Apache Qpid Python 1.35.0 发布
Apache Qpid Python 1.35.0 发布了,Apache Qpid (Open Source AMQP Messaging) 是一个跨平台的企业通讯解决方案,实现了高级消息队列协议.提 ...
- Apache Qpid 高可用集群
一.RHCS RHCS是Red Hat Cluster Suite(红帽子集群套件)的缩写.RHCS是一个功能完备的集群应用解决方案,它从应用的前端访问到后端的数据存储都提供了一个行之有效的集群架构实 ...
- Apache Qpid CPP的编译与安装
单机Broker部署(windows/linux) 在Windows/Linux上部署QPID Broker的方法. Windows 需要预先准备的文件和程序 qpid-cpp-0.32.tar.gz ...
- 14.LAMP服务 Linux Apache Mysql Php和防护机制 xinetd、tcp wapper
一.安装LAMP服务 Linux Apache Mysql Php 要求操作系统支持 php解析 apache调用php插件解析 phpmyadmin yum install ...
- 详解Apache Dubbo的SPI实现机制
一.SPI SPI全称为Service Provider Interface,对应中文为服务发现机制.SPI类似一种可插拔机制,首先需要定义一个接口或一个约定,然后不同的场景可以对其进行实现,调用方在 ...
- 超硬核解析!Apache Hudi灵活的Payload机制
Apache Hudi 的Payload是一种可扩展的数据处理机制,通过不同的Payload我们可以实现复杂场景的定制化数据写入方式,大大增加了数据处理的灵活性.Hudi Payload在写入和读取H ...
- Apache Qpid消息通讯模型和消息地址简介
Broker知识准备 Broker内置两种节点类型:一种是 queue,一种是 topic. 1. queue 节点能够缓存消息,直到被读取走为止.queue节点满足两个重要的 PTP 通信的特征, ...
- apache 使用htaccess自定义路由机制
先开启伪静态.详情查看这篇文章:http://www.cnblogs.com/CyLee/p/5544119.html 然后在项目根目录中新建一个.htaccess文件,加入以下代码 正则中()的变量 ...
随机推荐
- js中取绝对值的2种方法!
1.abs() var aaa=-20; var bbb=Math.abs(aaa); 2.加减法 var aaa=-20; var bbb=-aaa
- 用KMP征服循环节问题
以前我还是写过KMP的文章的 现在我们可以求一下循环节啊 Slot Machines Gym - 101667I #include<bits/stdc++.h> using namespa ...
- 2011 Michigan Invitational Programming Contest
Crossings Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100463 Description ...
- 【Kubernetes】深入解析声明式API
在Kubernetes中,一个API对象在Etcd里的完整资源路径,是由:Group(API组).Version(API版本)和Resource(API资源类型)三个部分组成的. 通过这样的结构,整个 ...
- BZOJ 1009 [HNOI2008]GT考试 ——矩阵乘法 KMP
先用KMP处理所有的转移,或者直接暴力也可以. 然后矩阵快速幂即可. #include <cstdio> #include <cstring> #include <ios ...
- [TJOI2009]开关 (线段树)
题目描述 现有N(2 ≤ N ≤ 100000)盏灯排成一排,从左到右依次编号为:1,2,......,N.然后依次执行M(1 ≤ M ≤ 100000)项操作,操作分为两种:第一种操作指定一个区间[ ...
- Hubtown
Hubtown 时间限制: 10 Sec 内存限制: 256 MB 题目描述 Hubtown is a large Nordic city which is home to n citizens. ...
- 看 nova
本节重点介绍 nova-scheduler 的调度机制和实现方法:即解决如何选择在哪个计算节点上启动 instance 的问题. 创建 Instance 时,用户会提出资源需求,例如 CPU.内存.磁 ...
- Fabrice Bellard其人 ---- FFMPEG及其他……
有些计算机科学家的名字耳熟能详:阿兰·图灵(Alan Turing).高纳德(Donald Knuth).艾兹赫尔·戴克斯特拉(Edsger Dijkstra),这些人的名气甚至大于他们突破性的成就. ...
- 浅谈Java字符串
从概念上而言,Java字符串就是Unicode字符序列.由于Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类String,每个用双引号的括起来的字符串都是String类的一个实 ...