หลังจากดำเนินการรับมือ WannaCry อยู่หลายวัน พบปัญหาติดขัดหลายอย่าง หนึ่งในนั้นก็คือพอแก้ไขคอนฟิกปิด SMB1 ในเครื่อง Windows จะทำให้เรียกแชร์ไฟล์บนเซิร์ฟเวอร์ Samba ไม่ได้
เนื่องจากดีฟอลต์คอนฟิกของ Samba ที่ถูกติดตั้งบนลีนุกซ์เพื่อรันเป็นเซิร์ฟเวอร์ไฟล์แชร์หลายรุ่น ไม่ได้เปิดให้รองรับ SMB2 protocol เอาไว้ ทำให้ถ้าปิดคอนฟิกไม่ให้ใช้ SMB1 บน Windows Client จะทำให้ไม่สามารถเรียกไฟล์ที่แชร์ผ่าน Samba ได้
ลองมาดูรายละเอียดและวิธีการแก้ไขปัญหากัน
คำเตือน ทดสอบบนเครื่องทดลองให้แน่ใจก่อน แล้วค่อยแก้ไขบนเครื่องเซิร์ฟเวอร์ที่ใช้งานจริง
ในที่นี่ทดสอบกับ CentOS 6 ติดตั้ง Samba 3.6
[root@centos-6 ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@centos-6 ~]# rpm -qa | grep samba samba-winbind-clients-3.6.23-42.el6_9.x86_64 samba-3.6.23-42.el6_9.x86_64 samba-doc-3.6.23-42.el6_9.x86_64 samba-winbind-3.6.23-42.el6_9.x86_64 samba-common-3.6.23-42.el6_9.x86_64 samba-client-3.6.23-42.el6_9.x86_64
เพื่อให้เห็นภาพการเลือกใช้ SMB protocol ในการเรียกแชร์ไฟล์ จะแก้ไขคอนฟิก smb.conf เพื่อให้เห็นข้อความ log เพิ่มเติม
[root@centos-6 ~]# vi /etc/samba/smb.conf
[global]
...
log level = 3
หมายเหตุ ไม่แนะนำให้เปิด log level = 3 ในเซิร์ฟเวอร์ที่มีการใช้งานจริง เพราะอาจกระทบกับประสิทธิภาพของเครื่องได้
รีสตาร์ตเซอร์วิส smb
[root@centos-6 ~]# service smb restart Shutting down SMB services: [ OK ] Starting SMB services: [ OK ]
เริ่มต้นจะทดสอบเรียกไฟล์แชร์จาก Windows 7 ที่ยังไม่ได้ปิดการเรียกแชร์ไฟล์โดยใช้ SMB1 protocol
จะขึ้นให้ใส่ Username, Password ถ้ากรอกถูกต้องก็จะสามารถเรียกแชร์ไฟล์ได้ตามปกติ
ลองมาดูข้อความในไฟล์ log ที่เกิดขึ้น ไฟล์จะถูกสร้างอยู่ใน /var/log/samba/ เป็นชื่อไฟล์ log. ตามด้วย IP ของเครื่อง Client ในที่นี้คือ 192.168.56.101 ที่เรียกเข้ามา
[root@centos-6 ~]# cat /var/log/samba/log.192.168.56.101 [2017/05/19 10:48:04.841439, 3] lib/access.c:338(allow_access) Allowed connection from 192.168.56.101 (192.168.56.101) ... [2017/05/19 10:48:04.842401, 3] smbd/negprot.c:598(reply_negprot) Requested protocol [PC NETWORK PROGRAM 1.0] [2017/05/19 10:48:04.842451, 3] smbd/negprot.c:598(reply_negprot) Requested protocol [LANMAN1.0] [2017/05/19 10:48:04.842475, 3] smbd/negprot.c:598(reply_negprot) Requested protocol [Windows for Workgroups 3.1a] [2017/05/19 10:48:04.842497, 3] smbd/negprot.c:598(reply_negprot) Requested protocol [LM1.2X002] [2017/05/19 10:48:04.842519, 3] smbd/negprot.c:598(reply_negprot) Requested protocol [LANMAN2.1] [2017/05/19 10:48:04.842540, 3] smbd/negprot.c:598(reply_negprot) Requested protocol [NT LM 0.12] [2017/05/19 10:48:04.842561, 3] smbd/negprot.c:598(reply_negprot) Requested protocol [SMB 2.002] [2017/05/19 10:48:04.842583, 3] smbd/negprot.c:598(reply_negprot) Requested protocol [SMB 2.???] [2017/05/19 10:48:04.842704, 3] smbd/negprot.c:419(reply_nt1) using SPNEGO [2017/05/19 10:48:04.842783, 3] smbd/negprot.c:704(reply_negprot) Selected protocol NT LM 0.12
ข้อความจะแสดงว่ามีการเชื่อมต่อจาก 192.168.56.101 โดย protocol ที่เครื่อง client (ในที่นี้คือ Windows 7) รองรับและต้องการใช้ (Requested protocol) มีทั้ง LANMAN, NT LM, SMB 2
ผลลัพธ์จะเลือกใช้ (Selected protocol) เป็น NT LM 0.12
ถ้าลองทดสอบจาก Windows แต่ละเวอร์ชัน รายชื่อ Requested Protocol ก็จะแตกต่างกันไป
เพื่อป้องกัน WannaCry เราจะใช้คำสั่ง sc config เพื่อปิดการใช้งาน SMB1 บนเครื่อง client
หลังจากรันคำสั่ง sc config และรีสตาร์ตเครื่อง Windows เรียบร้อย ถ้าลองเรียกแชร์ไฟล์บน Samba ดูอีกที จะไม่สามารถเรียกได้
ลองดูในไฟล์ log จะเห็นข้อความดังนี้
[root@centos-6 ~]# cat /var/log/samba/log.192.168.56.101 [2017/05/19 11:00:16.298173, 3] lib/access.c:338(allow_access) Allowed connection from 192.168.56.101 (192.168.56.101) ... [2017/05/19 11:00:16.300074, 3] smbd/negprot.c:598(reply_negprot) Requested protocol [NotSmb] [2017/05/19 11:00:16.300228, 3] smbd/negprot.c:598(reply_negprot) Requested protocol [NotSmb] [2017/05/19 11:00:16.300279, 3] smbd/negprot.c:598(reply_negprot) Requested protocol [NotSmb] [2017/05/19 11:00:16.300326, 3] smbd/negprot.c:598(reply_negprot) Requested protocol [NotSmb] [2017/05/19 11:00:16.300673, 3] smbd/negprot.c:598(reply_negprot) Requested protocol [NotSmb] [2017/05/19 11:00:16.300765, 3] smbd/negprot.c:598(reply_negprot) Requested protocol [NotSmb] [2017/05/19 11:00:16.301001, 3] smbd/negprot.c:598(reply_negprot) Requested protocol [SMB 2.002] [2017/05/19 11:00:16.301110, 3] smbd/negprot.c:598(reply_negprot) Requested protocol [SMB 2.???] [2017/05/19 11:00:16.301298, 0] smbd/negprot.c:706(reply_negprot) No protocol supported ! [2017/05/19 11:00:16.302119, 1] smbd/process.c:457(receive_smb_talloc) receive_smb_raw_talloc failed for client 192.168.56.101 read error = NT_STATUS_CONNECTION_RESET. [2017/05/19 11:00:16.302388, 3] smbd/server_exit.c:181(exit_server_common) Server exit (failed to receive smb request)
คือหลังจากใช้คำสั่ง sc config ปิดการใช้ SMB1 ตอนนี้ protocol ที่เครื่อง Windows รองรับจะเหลือแค่ SMB2 แต่เนื่องจากดีฟอลต์การติดตั้งเซิร์ฟเวอร์ Samba ไม่ได้เปิดใช้ SMB2 เอาไว้
ผลก็คือ “No protocol supported !” ไม่มี protocol ที่ใช้คุยกันได้ ระหว่าง Windows และ Samba
ใช้คำสั่ง testparm -v เพื่อดูดีฟอลต์คอนฟิกของ protocol
[root@centos-6 ~]# testparm -v | grep protocol
Load smb config files from /etc/samba/smb.conf
Processing section "[homes]"
Processing section "[printers]"
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions
max protocol = NT1
min protocol = CORE
ดีฟอลต์คอนฟิก protocol สูงสุด (max) ที่เซิร์ฟเวอร์ใช้ได้คือ NT1 ต้องแก้ค่าคอนฟิกนี้เพื่อให้รองรับ SMB2 ได้
ใช้คำสั่ง man smb.conf ดูในส่วน max protocol (G) เพื่อดูค่าคอนฟิกที่สามารถใส่ได้
[root@centos-6 ~]# man smb.conf ... max protocol (G) The value of the parameter (a string) is the highest protocol level that will be supported by the server. Possible values are : · CORE: Earliest version. No concept of user names. · COREPLUS: Slight improvements on CORE for efficiency. · LANMAN1: First modern version of the protocol. Long filename support. · LANMAN2: Updates to Lanman1 protocol. · NT1: Current up to date version of the protocol. Used by Windows NT. Known as CIFS. · SMB2: Re-implementation of the SMB protocol. Used by Windows Vista and newer.
protocol สูงสุดที่ Samba 3.6 รองรับได้ คือ SMB2
แก้ไขคอนฟิก smb.conf โดยระบุคอนฟิก max protocol = SMB2 ภายใต้ [global]
[root@centos-6 ~]# vi /etc/samba/smb.conf
[global]
...
log level = 3
max protocol = SMB2
รีสตาร์ตเซอร์วิส smb
[root@centos-6 ~]# service smb restart Shutting down SMB services: [ OK ] Starting SMB services: [ OK ]
ลองใช้ Windows เรียกแชร์ไฟล์บน Samba อีกครั้ง
ตัวอย่างข้อความที่ขึ้นในไฟล์ log
[root@centos-6 ~]# cat /var/log/samba/log.192.168.56.101 [2017/05/19 11:07:47.775645, 3] lib/access.c:338(allow_access) Allowed connection from 192.168.56.101 (192.168.56.101) ... [2017/05/19 11:07:47.776078, 3] smbd/negprot.c:598(reply_negprot) Requested protocol [NotSmb] [2017/05/19 11:07:47.776113, 3] smbd/negprot.c:598(reply_negprot) Requested protocol [NotSmb] [2017/05/19 11:07:47.776129, 3] smbd/negprot.c:598(reply_negprot) Requested protocol [NotSmb] [2017/05/19 11:07:47.776145, 3] smbd/negprot.c:598(reply_negprot) Requested protocol [NotSmb] [2017/05/19 11:07:47.776160, 3] smbd/negprot.c:598(reply_negprot) Requested protocol [NotSmb] [2017/05/19 11:07:47.776175, 3] smbd/negprot.c:598(reply_negprot) Requested protocol [NotSmb] [2017/05/19 11:07:47.776190, 3] smbd/negprot.c:598(reply_negprot) Requested protocol [SMB 2.002] [2017/05/19 11:07:47.776205, 3] smbd/negprot.c:598(reply_negprot) Requested protocol [SMB 2.???] [2017/05/19 11:07:47.776306, 3] smbd/negprot.c:704(reply_negprot) Selected protocol SMB 2.002
หลังการแก้ไขค่าคอนฟิก max protocol ตอนนี้ Samba ก็สามารถรองรับ protocol SMB2 เพื่อให้ Windows ที่รองรับเข้ามาใช้งานได้แล้ว
ในระยะสั้นคงไม่สามารถยกเลิกการใช้งาน Windows เก่าๆ เช่น XP ได้ (อย่าลืมอัพเดท Windows) คงต้องจำเป็นต้องเปิดคอนฟิกให้สามารถเรียกแชร์ไฟล์แบบ SMB1 อยู่ ซึ่งบน Samba สามารถกำหนดคอนฟิกได้โดย min protocol
ส่วน Windows ใหม่ๆ ที่รองรับ SMB2 แนะนำให้ใช้คำสั่ง sc config ปิดการใช้ SMB1 ไปเลย เพื่อป้องกันปัญหาในอนาคต
ข้อมูลอ้างอิง
- วิธีการ disable SMBv1 ใน SAMBA File Sharing
- วิธีปิด SMBv1 เพื่อป้องกันตัวเองจากมัลแวร์เรียกค่าไถ่ WannaCry (ทำเถอะ ไม่ถึง 5 นาที)
ขอบคุณครับ