1. 程式人生 > >activemq安全機制

activemq安全機制

activemq作為訊息中介軟體這樣一個獨立的個體存在,連通使用者和伺服器。如果沒有一套完備的安全機制去設定使用者許可權設定訊息分發機制可想後果是非常嚴重。ActiveMQ如果不加入安全機制的話,任何人只要知道訊息服務的具體地址(包括ip,埠,訊息地址[佇列或者主題地址,),都可以肆無忌憚的傳送、接收訊息。今天我們就探討一下他的安全機制。

1.安全機制介紹

我們討論安全機制一般包括兩個部分:

  1. 驗證(Authentication):就是要驗證一個使用者的有效性,即使用者名稱、密碼是否正確;
  2. 授權(Authorization):就是授予使用者某種角色,以使使用者只能訪問具有相應角色的資源。

activemq考慮到安全方案效率問題,他提供了可插拔的安全機制,你可以使用不同的安全外掛靈活為你的系統配置安全訪問方式。目前activemq提供兩種安全控制外掛:

  1. 簡單認證外掛(Simple authentication plugin-in)
  2. JAAS認證外掛(Java Authentication and Authorization Service)

下面我們分別就這兩種外掛的使用做一個說明。

2.簡單認證外掛

簡單認證外掛的目的就是讓使用者簡單配置。我們開啟activemq服務的目錄apache-activemq,在 conf目錄下找到activemq.xml。進去找到:

 <shutdownHooks>
    <bean xmlns="http://www.springframework.org/schema/beans" class="org.apache.activemq.hooks.SpringContextHook" />
</shutdownHooks>
    
  • 1
  • 2
  • 3

在他下面新增如下即可:

<plugins>
    <simpleAuthenticationPlugin>
        <users>
            <
authenticationUser username="admin" password="admin" groups="users,admins"/>
<authenticationUser username="user" password="password" groups="users"/> </users> </simpleAuthenticationPlugin> </plugins>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

☆注意:此處新增的使用者名稱和密碼要和你在專案中配置的activemq使用者名稱密碼是一致的,如果在專案中不是此處已經配置過的使用者傳送訊息的話,activemq客戶端不會受理該訊息。這樣就達到了對非命中使用者攔截的目的。

比如說你有客戶端使用的使用者是:

<amq:connectionFactory id="amqConnectionFactory"
                           brokerURL="tcp://127.0.0.1:61616"
                           userName="admin"
                           password="admin" />
    
  • 1
  • 2
  • 3
  • 4

那你就把該使用者配置到activemq的配置檔案中:

 <authenticationUser username="admin" password="admin" groups="users,admins"/>
    
  • 1

上面是對使用者進行限制,我們也可以對ip進行限制,還是在剛才的配置裡面加上下面這一句:

<plugins>
     <simpleAuthenticationPlugin>
                <users>
                    <authenticationUser username="admin" password="admin" groups="users,admins"/>
                   <!-- <authenticationUser username="user" password="password" groups="users"/>
                    <authenticationUser username="guest" password="password" groups="guests"/>-->
                </users>

            <transportConnectors>
             <transportConnector name="connection1" uri="tcp://0.0.0.0:61616" />
        </transportConnectors>
    </simpleAuthenticationPlugin>
</plugins>
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

0.0.0.0代表本網路中的所有主機,意味著該網段的所有主機都是可以通訊的。如果改成localhost或者127.0.0.1這種的那就只有本機了。這樣我們就達到了通過IP限制的目的。

3.JAAS認證外掛

JAAS(Java Authentication and Authorization Service)也就是java的驗證Authentication)、授權(Authorization)服務。簡單來說,驗證Authentication就是要驗證一個使用者的有效性,即使用者名稱、密碼是否正確。授權Authorization就是授予使用者某種角色,可以訪問哪些資源。JAASAuthentication Plugin依賴標準的JAAS機制來實現認證。通常情況下,你需要通過設定Java.security.auth.login.config系統屬性來配置login
modules的配置檔案。如果沒有指定這個系統屬性,那麼JAAS Authentication Plugin會預設使用login.config作為檔名。

首先我們需要編寫一個login.config檔案:

activemq {  
    org.apache.activemq.jaas.PropertiesLoginModule required  
    debug=true
        org.apache.activemq.jaas.properties.user="users.properties"  
        org.apache.activemq.jaas.properties.group="groups.properties";  
}; 
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

users.properties檔案:

admin=admin  
user=ad1
guest=ad1
    
  • 1
  • 2
  • 3

group.properties檔案:

admins=admin  
users=user  
guests=guest  
    
  • 1
  • 2
  • 3

☆需要注意的是,PropertiesLoginModule使用本地檔案的查詢方式,而且查詢時採用的base directory即login.config檔案所在的目錄,所以說這三個檔案需要在同一個目錄裡才會找得到。另外,activemq 5.9 預設提供了以上的配置檔案,我們來看一下檔案目錄:

然後我們還是在activemq.xml配置檔案中新增外掛。還是上面簡單外掛新增的位置,新增以下外掛即可,只不過你的把之前新增的簡單外掛註釋掉。

<plugins>
    <jaasAuthenticationPlugin configuration="activemq-domain" />     
    <authorizationPlugin>
        <map>
            <authorizationMap>
                <authorizationEntries>
                 <!-- .表示萬用字元,例如USERS.>表示以USERS.開頭的主題,>表示所有主題,read表示讀的許可權,write表示寫的許可權,admin表示角色組-->
                    <authorizationEntry queue=">" read="admins,guests" write="guests" admin="admins,guests" />
                    <authorizationEntry queue="USERS.>" read="users" write="users" admin="users" />
                    <authorizationEntry queue="GUEST.>" read="guests" write="guests,users" admin="guests,users" />

                    <authorizationEntry topic=">" read="admins" write="admins" admin="admins" />
                    <authorizationEntry topic="USERS.>" read="users" write="users" admin="users" />
                    <authorizationEntry topic="GUEST.>" read="guests" write="guests,users" admin="guests,users" />

                    <authorizationEntry topic="ActiveMQ.Advisory.>" read="guests,users" write="guests,users" admin="guests,users"/>
                </authorizationEntries>
            </authorizationMap>
        </map>
    </authorizationPlugin>
</plugins>
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

新增完以上配置部分,重啟avtivemq服務端,就會按照上面配置的使用者進行讀寫的許可權配置。

從上面看JAAS外掛的許可權分配要比簡單外掛的許可權更加細緻,不同的使用者可以分別配置讀寫的許可權,admin使用者擁有建立topic或是queue的特權等等這樣細緻的劃分,不同的使用者各司其職,減少了誤操作,或是刻意破換的可能性。

        <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/markdown_views-ea0013b516.css">
            </div>

activemq作為訊息中介軟體這樣一個獨立的個體存在,連通使用者和伺服器。如果沒有一套完備的安全機制去設定使用者許可權設定訊息分發機制可想後果是非常嚴重。ActiveMQ如果不加入安全機制的話,任何人只要知道訊息服務的具體地址(包括ip,埠,訊息地址[佇列或者主題地址,),都可以肆無忌憚的傳送、接收訊息。今天我們就探討一下他的安全機制。

1.安全機制介紹

我們討論安全機制一般包括兩個部分:

  1. 驗證(Authentication):就是要驗證一個使用者的有效性,即使用者名稱、密碼是否正確;
  2. 授權(Authorization):就是授予使用者某種角色,以使使用者只能訪問具有相應角色的資源。

activemq考慮到安全方案效率問題,他提供了可插拔的安全機制,你可以使用不同的安全外掛靈活為你的系統配置安全訪問方式。目前activemq提供兩種安全控制外掛:

  1. 簡單認證外掛(Simple authentication plugin-in)
  2. JAAS認證外掛(Java Authentication and Authorization Service)

下面我們分別就這兩種外掛的使用做一個說明。

2.簡單認證外掛

簡單認證外掛的目的就是讓使用者簡單配置。我們開啟activemq服務的目錄apache-activemq,在 conf目錄下找到activemq.xml。進去找到:

 <shutdownHooks>
    <bean xmlns="http://www.springframework.org/schema/beans" class="org.apache.activemq.hooks.SpringContextHook" />
</shutdownHooks>
  
  • 1
  • 2
  • 3

在他下面新增如下即可:

<plugins>
    <simpleAuthenticationPlugin>
        <users>
            <authenticationUser username="admin" password="admin" groups="users,admins"/>
           <authenticationUser username="user" password="password" groups="users"/>     
        </users>
    </simpleAuthenticationPlugin>
</plugins>
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

☆注意:此處新增的使用者名稱和密碼要和你在專案中配置的activemq使用者名稱密碼是一致的,如果在專案中不是此處已經配置過的使用者傳送訊息的話,activemq客戶端不會受理該訊息。這樣就達到了對非命中使用者攔截的目的。

比如說你有客戶端使用的使用者是:

<amq:connectionFactory id="amqConnectionFactory"
                           brokerURL="tcp://127.0.0.1:61616"
                           userName="admin"
                           password="admin" />
  
  • 1
  • 2
  • 3
  • 4

那你就把該使用者配置到activemq的配置檔案中:

 <authenticationUser username="admin" password="admin" groups="users,admins"/>
  
  • 1

上面是對使用者進行限制,我們也可以對ip進行限制,還是在剛才的配置裡面加上下面這一句:

<plugins>
     <simpleAuthenticationPlugin>
                <users>
                    <authenticationUser username="admin" password="admin" groups="users,admins"/>
                   <!-- <authenticationUser username="user" password="password" groups="users"/>
                    <authenticationUser username="guest" password="password" groups="guests"/>-->
                </users>

            <transportConnectors>
             <transportConnector name="connection1" uri="tcp://0.0.0.0:61616" />
        </transportConnectors>
    </simpleAuthenticationPlugin>
</plugins>
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

0.0.0.0代表本網路中的所有主機,意味著該網段的所有主機都是可以通訊的。如果改成localhost或者127.0.0.1這種的那就只有本機了。這樣我們就達到了通過IP限制的目的。

3.JAAS認證外掛

JAAS(Java Authentication and Authorization Service)也就是java的驗證Authentication)、授權(Authorization)服務。簡單來說,驗證Authentication就是要驗證一個使用者的有效性,即使用者名稱、密碼是否正確。授權Authorization就是授予使用者某種角色,可以訪問哪些資源。JAASAuthentication Plugin依賴標準的JAAS機制來實現認證。通常情況下,你需要通過設定Java.security.auth.login.config系統屬性來配置login
modules的配置檔案。如果沒有指定這個系統屬性,那麼JAAS Authentication Plugin會預設使用login.config作為檔名。

首先我們需要編寫一個login.config檔案:

activemq {  
    org.apache.activemq.jaas.PropertiesLoginModule required  
    debug=true
        org.apache.activemq.jaas.properties.user="users.properties"  
        org.apache.activemq.jaas.properties.group="groups.properties";  
}; 
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

users.properties檔案:

admin=admin  
user=ad1
guest=ad1
  
  • 1
  • 2
  • 3

group.properties檔案:

admins=admin  
users=user  
guests=guest  
  
  • 1
  • 2
  • 3

☆需要注意的是,PropertiesLoginModule使用本地檔案的查詢方式,而且查詢時採用的base directory即login.config檔案所在的目錄,所以說這三個檔案需要在同一個目錄裡才會找得到。另外,activemq 5.9 預設提供了以上的配置檔案,我們來看一下檔案目錄:

然後我們還是在activemq.xml配置檔案中新增外掛。還是上面簡單外掛新增的位置,新增以下外掛即可,只不過你的把之前新增的簡單外掛註釋掉。

<plugins>
    <jaasAuthenticationPlugin configuration="activemq-domain" />     
    <authorizationPlugin>
        <map>
            <authorizationMap>
                <authorizationEntries>
                 <!-- .表示萬用字元,例如USERS.>表示以USERS.開頭的主題,>表示所有主題,read表示讀的許可權,write表示寫的許可權,admin表示角色組-->
                    <authorizationEntry queue=">" read="admins,guests" write="guests" admin="admins,guests" />
                    <authorizationEntry queue="USERS.>" read="users" write="users" admin="users" />
                    <authorizationEntry queue="GUEST.>" read="guests" write="guests,users" admin="guests,users" />

                    <authorizationEntry topic=">" read="admins" write="admins" admin="admins" />
                    <authorizationEntry topic="USERS.>" read="users" write="users" admin="users" />
                    <authorizationEntry topic="GUEST.>" read="guests" write="guests,users" admin="guests,users" />

                    <authorizationEntry topic="ActiveMQ.Advisory.>" read="guests,users" write="guests,users" admin="guests,users"/>
                </authorizationEntries>
            </authorizationMap>
        </map>
    </authorizationPlugin>
</plugins>
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

新增完以上配置部分,重啟avtivemq服務端,就會按照上面配置的使用者進行讀寫的許可權配置。

從上面看JAAS外掛的許可權分配要比簡單外掛的許可權更加細緻,不同的使用者可以分別配置讀寫的許可權,admin使用者擁有建立topic或是queue的特權等等這樣細緻的劃分,不同的使用者各司其職,減少了誤操作,或是刻意破換的可能性。

        <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/markdown_views-ea0013b516.css">
            </div>