What
CHAP 认证是 iSCSI 协议中最主要的认证方式,现有的开源 iSCSI 实现(包括
initiator 和 target 实现)基本上都只支持 CHAP 认证
CHAP 协议
CHAP[1]的全称是 Challenge-Handshake Authentication Protocol,协议细节由
RFC 1994 进行定义。CHAP 最初应用在 Point to Point Protocol(PPP)中,用于实
现 PPP 服务器对客户端的身份认证,但也可以应用在其它需要对用户或主机进
行身份认证的场合,如 iSCSI 协议就规定使用 iSCSI 协议进行通信的设备必须
(MUST)实现 CHAP 认证。
CHAP 分为:
initiator连接target时进行认证
initiator 和 target 都进行认证
单向配置
在 iScsi 中 认证分为两种模式 discover 模式和 session 方式
Target 上设置
设置 discover 认证
Shell
Copy
/iscsi> set discovery_auth enable=1 userid=hello password=xxxx
设置 session 认证
Shell
Copy
# 到具体的 acl client 下设置 userid 和 password
/> cd iscsi/iqn.2022-11.rio-csi.srv:rio.xs2298/tpg1/acls/iqn.1993-08.org.debian:01:219b5d4f819a/
/iscsi/iqn.19...219b5d4f819a> set auth userid=hello
Parameter userid is now 'hello'.
/iscsi/iqn.19...219b5d4f819a> set auth password=xxxx
Parameter password is now 'xxxx'.
/iscsi/iqn.19...219b5d4f819a> cd /
/> saveconfig
Configuration saved to /etc/target/saveconfig.json
只通过 discover 认证,也需要在 acls 里面加上 client 的 iniatorname 否则也不会登录不上
Initiator 设置
修改配置文件/etc/iscsi/iscsi/iscsid.conf 开启并配置CHAP
Shell
Copy
# *************
# CHAP Settings
# *************
# To enable CHAP authentication set node.session.auth.authmethod
# to CHAP. The default is None.
node.session.auth.authmethod = CHAP
# To set a CHAP username and password for initiator
# authentication by the target(s), uncomment the following lines:
node.session.auth.username = hello
node.session.auth.password = xxxx
# To set a CHAP username and password for target(s)
# authentication by the initiator, uncomment the following lines:
#node.session.auth.username_in = hello
#node.session.auth.password_in = xxxx
# To enable CHAP authentication for a discovery session to the target
# set discovery.sendtargets.auth.authmethod to CHAP. The default is None.
discovery.sendtargets.auth.authmethod = CHAP
# To set a discovery session CHAP username and password for the initiator
# authentication by the target(s), uncomment the following lines:
discovery.sendtargets.auth.username = hello
discovery.sendtargets.auth.password = xxxx
# To set a discovery session CHAP username and password for target(s)
# authentication by the initiator, uncomment the following lines:
#discovery.sendtargets.auth.username_in = hello
#discovery.sendtargets.auth.password_in = xxxx
注意这里面也分为 session 和 discovery 两种方式
改好以后重启 systemctl restart iscsid open-iscsi
或者命令方式传入 CHAT
iscsiadm -m discoverydb -t sendtargets -p 0.0.0.0:3260 -I default -o update -n discovery.sendtargets.auth.authmethod -v CHAP -n discovery.sendtargets.auth.username -v hello -n discovery.sendtargets.auth.password -v xxxx
需要先执行 discover 找到存储
连接:
Shell
Copy
# 找到存储
iscsiadm -m discoverydb -t sendtargets -p 0.0.0.0:3260 -I default --discover
# 会在 /etc/iscsi/sendtargets 存储信息
# 为这个 sendtargets 添加认证方式这样就可以不将用户密码配置在 配置文件中
# 清除配置
iscsiadm -m discoverydb -t sendtargets -p 10.34.34.36:3260 -I default -o delete
# 新建配置
iscsiadm -m discoverydb -t sendtargets -p 10.34.34.36:3260 -I default -o new
登录指定存储
iscsiadm --mode node --portal 0.0.0.0 3260 --login
iscsiadm -m session -T iqn -p 0.0.0.0:3260 -l
iscsiadm -m node -T iqn -p 0.0.0.0:3260 -l
iscsiadm -m discovery -p 0.0.0.0:3260 -l
登录后会在 /etc/iscsi/nodes 存储信息以便后面登录
双向认证
Target 上设置
Shell
Copy
/> iscsi/ set discovery_auth enable=1 userid=client password=client123 mutual_userid=server mutual_password=server123
Initiator 设置
在 /etc/iscsi/iscsi/iscsid.conf 上增加了 target 到 initiator 的检查,也就是 上面的 mutual 里面设置的内容
Shell
Copy
discovery.sendtargets.auth.username_in = server
discovery.sendtargets.auth.password_in = server123
参考: