iSCSI 除了指定 IP 做 ACL https://benjr.tw/15652 ,還可以透過 user / password CHAP (Challenge Handshake Authentication Protocol) 使用 MD5 的加密驗證做身分驗證.
CHAP (Challenge Handshake Authentication Protocol) 有下列幾種.
- 單向 CHAP 驗證 – 在此安全性等級,只有目標 Target 會做驗證
- 相互 CHAP 驗證 – 在此安全性等級,目標 Target 與啟動器 Initiator 皆會被彼此做驗證.
- Reverse CHAP – 一般的 CHAP 使用 one-way hash,密碼檔無法回朔,但是使用 Reverse CHAP 是可以的.關於 Reverse CHAP 目前網路上我還查不太到很多的資料所以無法做說明.
單向 CHAP 驗證
先來說明第一種 單向 CHAP 驗證CHAP(Challenge Handshake Authentication Protocol)
預設 iSCSI 採用了 單向 CHAP(Challenge Handshake Authentication Protocol) 的身分驗證方式,基本上是一種以 MD5 的加密驗證方式.方式如下:
- 在雙方(Target / Initiator) 建立連線後,Target 送出 "challenge" 的訊息告知 Initiator 要做身分驗證.
- Initiator 會將使用者密碼使用 md5 做 one-way hash 並送出去給 Target 端.
假如使用者密碼是 :123456 ,md5 做過 one-way hash 之後變成 : f447b20a7fcbf53a5d5be013ea0b15af - Target 端將以經過 md5 的密碼和 Initiator 做比對,如果比對正確,這身份驗證及成立要不然就會將此次連結做中斷.
Target 端並沒有將原先密碼儲存下來,而是將密碼紀錄成做過 one-way hash 的 f447b20a7fcbf53a5d5be013ea0b15af.如果兩邊的 md5 一樣即代表成立. - 在正常連線過程中會不時重復做 1~3 的 CHAP 身分驗證.
為什麼身分驗證會採用 One Way Hashes 其優點是原資料已經不存在,傳送在網路上不需怕密碼檔被盜取.
One Way Hashes 主要會產生一組固定長度字串(fingerprint or message digests),這組字串用來比對原資料是否遭到修改,它的特性如下
- 原資料輸入長度為可變
- 輸出的 fingerprint 為固定長度
- 當資料任何 byte 改變時, fingerprint 也會變的完全不同
- 我們無法依據 fingerprint 來回推成原資料,這也是為什麼稱為 One Way hash(單方向的資料運算,函數多對一的特性)
既然無法回推成原資料,那怎知資料是否正確, One Way hash 會再將資料再做一次 One Way hash 然後直接比對 fingerprint 是否一樣.
不過所有的連線還是會受到 ACL 的限制, CHAP 只是多加上一層保護.先將之前設定先取消,將 ACL 改成 ALL.
[root@benjr ~]# tgtadm –lld iscsi –op unbind –mode target –tid 1 -I 192.8.1.121 [root@benjr ~]# tgtadm –lld iscsi –op unbind –mode target –tid 1 -I 192.8.1.0/24 [root@benjr ~]# tgtadm –lld iscsi –op unbind –mode target –tid 1 -I ALL
iSCSI 的帳號跟本地端的 Linux 帳號密碼無關,所以必須透過 "tgtadm" 來建立.
[root@benjr ~]# tgtadm –lld iscsi –op new –mode account –user benjr –password benjr [root@benjr ~]# tgtadm –lld iscsi –op show –mode account Account list: benjr
帳號是建立好了還要將他指定到哪一個 target.
[root@benjr ~]# tgtadm –lld iscsi –op bind –mode account –tid 1 –user benjr [root@benjr ~]# tgtadm –lld iscsi –op show –mode target Target 1: iqn.2009-4.tw.benjr:storage System information: Driver: iscsi Status: running I_T nexus information: I_T nexus: 4 Initiator: iqn.1994-05.com.redhat:116f23e2ef8 Connection: 0 IP Address: 192.8.1.121 LUN information: LUN: 0 Type: controller SCSI ID: deadbeaf1:0 SCSI SN: beaf10 Size: 0 Backing store: No backing store LUN: 1 Type: disk SCSI ID: deadbeaf1:1 SCSI SN: beaf11 Size: 9G Backing store: /dev/sdb1 Account information: benjr ACL information: ALL
iSCSI initiator 如要使用 CHAP 登入 Target,我們需要修改 /etc/iscsi/iscsid.conf, node.session.auth.username 和 node.session.auth.password 都要修改剛剛設定好的 –user benjr –password benjr
incoming 或是 outgoing 的 password 和 username 的最大限制是 256 字元.
[root@benjr ~]# cat /etc/iscsi/iscsid.conf node.session.auth.username = benjr node.session.auth.password = benjr
相互 CHAP 驗證
相互的 CHAP 的認證端可為 Target(Incoming Authentication) 或是 Initiator (Outgoing Authentication) 任一端來認證.也就是說 Target(Incoming Authentication)
- 由 Target 端為 Initiator 認證.這樣的認證方式可以允許多個 Initiator 來連接到 Target.
- 而 Initiator(Outgoing Authentication) 是由 Initiator 來認證 Target 端.
之前我們都是在 Target 端設定帳號密碼,這就是使用 Incoming Authentication 是由 Target 端為 Initiator 認證.要同時使用 Outgoing Authentication 也很簡單.只要指定 outgoing 的 user 和 password
剛剛已經設定過 Incoming 的認證方式,現在要透過 "tgtadm" 來建立 Outgoing 的認證.
[root@benjr ~]# tgtadm –lld iscsi –op new –mode account –user in_benjr –password in_benjr –outgoing [root@benjr ~]# tgtadm –lld iscsi –op show –mode account Account list: benjr in_benjr
帳號是建立好了還要將他指定到哪一個 target.
[root@benjr ~]# tgtadm –lld iscsi –op bind –mode account –tid 1 –user benjr –outgoing [root@benjr ~]# tgtadm –lld iscsi –op show –mode target Target 1: iqn.2009-4.tw.benjr:storage System information: Driver: iscsi Status: running I_T nexus information: I_T nexus: 4 Initiator: iqn.1994-05.com.redhat:116f23e2ef8 Connection: 0 IP Address: 192.8.1.121 LUN information: LUN: 0 Type: controller SCSI ID: deadbeaf1:0 SCSI SN: beaf10 Size: 0 Backing store: No backing store LUN: 1 Type: disk SCSI ID: deadbeaf1:1 SCSI SN: beaf11 Size: 9G Backing store: /dev/sdb1 Account information: benjr in_benjr (outgoing) ACL information: ALL
iSCSI initiator 如要使用 Outgoing CHAP ,我們需要修改 /etc/iscsi/iscsid.conf, node.session.auth.username_in 和 node.session.auth.password_in 都要修改剛剛設定好的
[root@benjr ~]# cat /etc/iscsi/iscsid.conf node.session.auth.username = benjr node.session.auth.password = benjr node.session.auth.username_in = in_benjr node.session.auth.password _in= in_benjr