前言
上一篇博客中我們講了如何搭建一個簡單的iscsi網絡存儲系統,這塊有個安全問題就是,任何知道target name的客戶端都可以隨意連接ISCSI服務器。但是很多時候,通過授權認證連接共享磁盤或者分區是必須的,例如 只允許客戶端主機A連接target共享出來的磁盤分區1,而客戶端主機b只運行連接target分享的磁盤分區2,在這種情況下,就需要在ISCSI target主機上進行授權設定了。
ISCSI在授權訪問和安全管理方面很有優勢,它能夠以主機為基礎,也就是以IP地址為基礎來設定允許或者拒絕,也可以通過賬戶名密碼認證來設定允許或者拒絕存取。
下面通過一套實驗環境來配置看看情況
客戶端/服務端 | IP | 共享的磁盤 |
---|---|---|
服務器端 | 172.16.22.142 | /dev/sdb下的兩個分區 |
客戶端 | 172.16.160.191 | /dev/sdb1 |
客戶端 | 172.16.160.192 | /dev/sdb2 |
- 通過ip來限定客戶端連接不同的磁盤或者分區
- 通過用戶名密碼連接不同的磁盤或分區
通過ip來限定
首先更改配置文件,我在服務器端(172.16.22.142)配置文件如下:
[root@salt etc]# tail /etc/tgt/targets.conf
#</target>
<target iqn.2016.11.09.com.server:test.target1>
backing-store /dev/sdb5
initiator-address 172.16.160.191 # 這個參數就是限定了哪個ip能夠過來訪問,詳情可以看配置文件的樣例
</target>
<target iqn.2016.11.09.com.server:test.target2>
backing-store /dev/sdb5
initiator-address 172.16.160.192
</target>
改為重啟服務
[root@salt etc]# /etc/init.d/tgtd restart
Stopping SCSI target daemon: initiators still connected [FAILED]
Starting SCSI target daemon: [ OK ]
此時在客戶端 172.16.160.191 查看:
[root@localhost ~]# iscsiadm -m discovery -t sendtargets -p 172.16.22.142
172.16.22.142:3260,1 iqn.2016-11.com.ljf:server.target1 # 共享的,所有人可以查看,未作限定
172.16.22.142:3260,1 iqn.2016.11.09.com.server:test.target1 # 191只能查看target1這塊盤
在另一個客戶端 172.16.160.192 查看:
[root@linux-node1 ~]# iscsiadm -m discovery -t sendtargets -p 172.16.22.142
172.16.22.142:3260,1 iqn.2016-11.com.ljf:server.target1 # 共享的,所有人可以查看,未作限定
172.16.22.142:3260,1 iqn.2016.11.09.com.server:test.target2 # 192只能查看target2這塊盤
自此,通過ip來限定客戶端連接不同的磁盤或者分區。
通過用戶名密碼
iscsi target以賬戶名密碼方式認證分為兩階段
第一階段是discovery查詢認證所使用的賬戶和密碼(即sendTarget用的)
第二階段是登陸target /iqn 所使用的賬戶密碼(即login登陸時使用的)
這種方式復雜點,需要在Initiator主機和iscsi target服務器上進行簡單配置。
配置ISCSI target
我們在172.16.22.142上配置tgtd,配置文件內容如下:
[root@salt ~]# tail /etc/tgt/targets.conf
<target iqn.2016.11.com.server:test.target_191haha>
backing-store /dev/sdb2
incominguser user191 user191 # 第一個user191是用戶名,第二個user191是密碼
</target>
<target iqn.2016.11.com.server:test.target192>
backing-store /dev/sdb1
incominguser user192 user192
</target>
配置完成后重啟服務:
[root@salt ~]# service tgtd restart
然后我們在iscsi Initiator 172.16.160.191上配置用戶名和密碼,命令如下:
[root@localhost ~]# grep ^[a-Z] /etc/iscsi/iscsid.conf # 增加下面6行
node.session.auth.authmethod = CHAP
node.session.auth.username = user191 # 登陸連接的時候驗證身份
node.session.auth.password = user191
discovery.sendtargets.auth.authmethod = CHAP
discovery.sendtargets.auth.username = user191 # discovery 的時候驗證身份
discovery.sendtargets.auth.password = user191
[root@localhost ~]# /etc/init.d/iscsi restart #改完后重啟服務
[root@localhost ~]# iscsiadm -m discovery -t sendtargets -p 172.16.22.142
iscsiadm: This command will remove the record [iface: default, target: iqn.2016.11.09.com.server:test.target191, portal: 172.16.22.142,3260], but a session is using it. Logout session then rerun command to remove record.
172.16.22.142:3260,1 iqn.2016.11.com.server:test.target192
172.16.22.142:3260,1 iqn.2016.11.com.server:test.target_191haha
[root@localhost ~]# iscsiadm -m node -p 172.16.22.142 -l # 登陸服務器
iscsi Initiator 172.16.160.192同理可得,同樣的操作,我就不演示了。
錯誤總結
在這沒有成功之前,我這邊出現了一個奇怪的情況,就是在iscsi Initiator端死活discovery不了我剛才設定的
通過用戶名密碼來訪問的磁盤,服務端tgtd程序和客戶端iscsi重啟N回都沒有改變這症狀,突然我在iscsi服務器端ps -ef |grep tgtd發現了啟動了多個程序,導致客戶端發現不了。於是,殺死進程重啟服務就好使了。
[root@salt ~]# /etc/init.d/tgtd stop
Stopping SCSI target daemon: [ OK ]
[root@salt ~]# netstat -lnpt #奇怪的是,明明stop掉了進程,為什么還有tgtd進程呢?
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1538/sshd
tcp 0 0 0.0.0.0:4505 0.0.0.0:* LISTEN 1704/python2.6
tcp 0 0 0.0.0.0:4506 0.0.0.0:* LISTEN 1833/python2.6
tcp 0 0 0.0.0.0:3260 0.0.0.0:* LISTEN 2953/tgtd
tcp 0 0 :::22 :::* LISTEN 1538/sshd
tcp 0 0 :::3260 :::* LISTEN 2953/tgtd
[root@salt ~]# /etc/init.d/tgtd stop
Stopping SCSI target daemon: not running [FAILED]
[root@salt ~]# netstat -lnpt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1538/sshd
tcp 0 0 0.0.0.0:4505 0.0.0.0:* LISTEN 1704/python2.6
tcp 0 0 0.0.0.0:4506 0.0.0.0:* LISTEN 1833/python2.6
tcp 0 0 0.0.0.0:3260 0.0.0.0:* LISTEN 2953/tgtd
tcp 0 0 :::22 :::* LISTEN 1538/sshd
tcp 0 0 :::3260 :::* LISTEN 2953/tgtd
[root@salt ~]# ps -ef |grep tgt
root 2953 1 0 Nov08 ? 00:00:00 tgtd
root 2956 2953 0 Nov08 ? 00:00:00 tgtd
root 5233 2915 0 00:09 pts/0 00:00:00 grep tgt
[root@salt ~]# kill 2956 #干掉他們后啟動服務器就好了
[root@salt ~]# kill 2953
[root@salt ~]# kill -9 2953
[root@salt ~]# kill -9 2953
-bash: kill: (2953) - No such process
[root@salt ~]# kill -9 2956
-bash: kill: (2956) - No such process
[root@salt ~]# kill -9 2956
-bash: kill: (2956) - No such process
[root@salt ~]#
[root@salt ~]# /etc/init.d/tgtd start
Starting SCSI target daemon: [ OK ]
有問題請隨時與我聯系,18500777133@sina.cn