ในปัจจุบัน สามารถพบได้ว่ามีผู้ไม่ประสงค์ดี พยายามในการ access เข้าใช้งานระบบโดยไม่ได้รับอนุญาตเป็นจำนวนเพิ่มขึ้น ทั้งจากช่องโหว่ในส่วน OS system, Software หรือ จาก script ที่มีการเขียนเพื่อใช้งาน service ต่างบน server

สำหรับบทความนี้ จะนำเสนอ การเพิ่มความปลอดภัยเบื้องต้นให้กับ Centos 7 server  หลังจากที่มีการติดตั้ง Centos7 minimal เรียบร้อยแล้ว ซึ่งผู้ใช้งาน CentOS 7 ควรเลือกปรับแต่งตามความเหมาะสมในเรื่องต่างๆ ดังนี้

การแยก partition เพื่อใช้งาน

ในการติดตั้ง linux server ควรมีการแยกส่วนของ partition ที่ใช้งานสำหรับ system ออกจากส่วนที่มีการเรียกใช้หรือเข้าถึงข้อมูลจากภายนอก ทั้งนี้เพื่อให้สามารถกำหนดสิทธ์ ของผู้เข้าใช้งานได้มีประสิทธิภาพยิ่งขึ้น

ตัวอย่าง เช่น สามารถแยกเป็น

/

/boot

/home

/tmp

/var

การเพิ่มความปลอดภัยสำหรับ Boot loader

เมื่อมีการติดตั้ง CentOS เรียบร้อยแล้ว บน linux server จะมี level ต่างๆ ให้เลือก boot เพื่อใช้งานตามต้องการของ user ในการเลือกนำไปใช้งาน เช่น level 3 คือ multi-user ซึ่งเป็น text mode หรือ level 5 เป็น graphic mode

ทั้งนี้ สำหรับ linux operating system จะมี GRand Unified Bootloader (GRUB) ซึ่งเป็น default bootloader เพื่อให้ใช้งาน

Traditional runlevel      New target name     Symbolically linked to...
Runlevel 0           |    runlevel0.target -> poweroff.target
Runlevel 1           |    runlevel1.target -> rescue.target
Runlevel 2           |    runlevel2.target -> multi-user.target
Runlevel 3           |    runlevel3.target -> multi-user.target
Runlevel 4           |    runlevel4.target -> multi-user.target
Runlevel 5           |    runlevel5.target -> graphical.target
Runlevel 6           |    runlevel6.target -> reboot.target

ในกรณีที่ไม่สามารถเปิดใช้งาน level 3 หรือ level 5 ได้ อาจจะด้วยปัญหาใดๆ ก็ตาม linux จะมี level 1 หรือที่รู้จักกันในชื่อ single user mode ซึ่งผู้ดูแลระบบนิยมใช้งานในการเข้าจัดการแก้ไขระบบ โดยใน mode นี้ มักจะไม่มีการป้องกันการเข้าใช้งาน ซึ่งทำให้ผู้ใดก็สามารถเข้าใช้งานและแก้ไขส่วนต่างๆ ได้

ตัวอย่าง เมื่อ server ทำการ boot และยังไม่มีการกำหนดค่า password

เพื่อป้องกันการเข้าใช้งาน GRUB จากผู้ไม่ประสงค์ดี เราสามารถกำหนดรหัสผ่านได้ดังนี้

สร้างรหัสผ่านด้วยคำสั่งด้านล่างนี้และใส่ค่ารหัสผ่านเมื่อกำหนดเรียบร้อย ระบบจะแสดงค่า MD5 hash รหัสผ่านกลับมา

$ sudo grub-md5-crypt 
Password: กำหนดค่ารหัสผ่านที่ต้องการ
Retype password: กำหนดค่ารหัสผ่านที่ต้องการอีกครั้ง
$1$a2gmN/$XGqo2gGYxR9Ly36v2yFI71

เปิดไฟล์ /boot/grub/grub.conf หรือ /boot/grub/menu.lst เพื่อเพิ่มค่า MD5 จากคำสั่งก่อนหน้านี้ลงไปยังไฟล์

#
## Note that you do not have to rerun grub after making changes to this file
## NOTICE:  You do not have a /boot partition.  This means that
##          all kernel and initrd paths are relative to /, eg.
##          root (hd0,0)
##          kernel /boot/vmlinuz-version ro root=/dev/sda1
##          initrd /boot/initrd-[generic-]version.img
##boot=/dev/sda
default=0
timeout=10

password --md5 $1$a2gmN/$XGqo2gGYxR9Ly36v2yFI71

#splashimage=(hd0,0)/boot/grub/splash.xpm.gz
#
title CentOS Linux (3.10.0-514.21.2.el7.centos.plus.x86_64) 7 (Core)
        root (hd0,0)
        kernel /boot/vmlinuz-3.10.0-514.21.2.el7.centos.plus.x86_64
 root=/dev/vda1 console=tty0 ro vconsole.keymap=us vconsole.font=latarcyrheb-sun16 
LANG=en_US.UTF-8 net.ifnames=0 biosdevname=0 nomodeset
        initrd /boot/initramfs-3.10.0-514.21.2.el7.centos.plus.x86_64.img
…

บันทึกไฟล์ และทดสอบโดยการสั่ง reboot server

ตัวอย่าง เมื่อ server ทำการ boot มีการกำหนดค่ารหัสผ่านแล้ว


การกำหนดค่าบนไฟล์ fstab

สำหรับไฟล์ fstab นั้นจะเป็นไฟล์ที่มีการเก็บข้อมูลของ partition ,disk จากอุปกรณ์ต่างๆ ที่ต้องการ mount เพื่อใช้งาน สำหรับไฟล์นี้จะอยู่ที่ /etc/fstab

ข้อมูลในไฟล์ fstab จะประกอบ ด้วย 6 คอลัมน์ คือ
คอลลั่มที่ 1,2 คือ คอลัมน์สำหรับอุปกรณ์ และ mount point
คอลัมน์ที่ 3 คือ filesystem type ที่ต้องการ mount เช่น ext3, ext4, swap, ntfs เป็นต้น
คอลลั่มที่ 4 คือ การกำหนดค่า option สำหรับการ mount
คอลลั่มที่ 5,6 คือ การ dump ข้อมูล และ การกำหนดการ check system
(ข้อมูลเพิ่มเติม: fstab)

ตัวอย่างไฟล์ fstab

/dev/sda1	/boot    	ext4	defaults,nosuid,noexec,nodev  	1 2
/dev/sda2     	/       	ext4	defaults        		1 1
/dev/sda3      	/home		ext4	defaults,nosuid,nodev  		1 2
/dev/sda4      	/var		ext4	defaults,nosuid        		1 2
/dev/sda2 	swap 		swap	defaults			0 0
/dev/sda5  	/tmp         	ext4	defaults,nosuid,nodev,noexec 	0 0

จะเห็นได้ว่า แต่ละ partition มีการกำหนด option (คอลลั่มที่ 4) แตกต่างกันไปตามการใช้งาน เช่น partition /tmp ซึ่งถือเป็นที่เก็บข้อมูลชั่วคราวต่างๆ เช่น session หรือไฟล์ที่ไม่มีการใช้งานในระยะยาว ไม่จำเป็นต้อง run ไฟล์ binary ได้ ซึ่งจากตัวอย่างจะมีการป้องกันเพิ่มเติมดังนี้

  • Option nosuid เป็นการกำหนดเพื่อ ปิดกั้นการทำงานของ suid (set user ID upon execution) และ sgid bits (set group ID upon execution) ซึ่งโดยปกติการกำหนดค่า setuid และ setgid กำหนดด้วยคำสั่งchmod
  • Option nodev กำหนดเพื่อไม่ให้มีการสร้าง block devices ใดๆ บน partition นี้
  • Option noexec เป็นการกำหนดให้ไม่สามารถ run ไฟล์ binary ที่อยู่ใน partition นั้นๆ ได้ ซึ่งเหมาะกับ partition ที่ไม่ต้องการให้มีการ run binary เช่น tmp เป็นต้น

จากตัวอย่างด้านบนจะเห็นว่ามีการแยกส่วน partition ที่ใช้งาน system หลัก(/) และส่วนที่มีการใช้งานอื่นๆ ออกจากกัน เพื่อให้สะดวกในกำหนด option ในคอลลั่มที่ 4 ในการสร้างความปลอดภัยให้กับการเข้าใช้งานใน partition ที่แตกต่างกันตามสิทธิ์การใช้งาน

การติดตั้งและยกเลิก service หรือ package  

ปัจจุบัน ผู้ดูแลระบบสามารถติดตั้ง program ต่างๆ ได้ง่ายยิ่งขึ้นด้วยการ run คำสั่ง yum

การติดตั้ง program, application, service ที่มากเกินความจำเป็น หรือเลือกทุกตัวเลือก หากมีคำถามในการติดตั้งใดๆ ถือเป็นความเสี่ยงที่อาจทำให้เกิดช่องโหว่ให้กับของระบบได้ ดังนั้นควรเลือกติดตั้งเฉพาะโปรแกรมที่จำที่ต้องใช้งานเท่านั้น

ทั้งนี้เนื่องจาก server แต่ละเครื่องมีการติดตั้งแตกต่างกันไป ตามการในใช้งาน ดังนั้น ณ ที่นี้จึงไม่สามารถแจ้งได้ว่า package ใดมีความจำเป็นหรือไม่จำเป็นในการติดตั้ง ซึ่งส่วนนี้ขึ้นอยู่กับการพิจารณาของผู้ดูแลระบบเอง ในความเหมาะสม

การตรวจสอบ package ที่มีการติดตั้ง

$ sudo yum list installed >> ~/installed.txt

การตรวจสอบ service ที่มีการติดตั้ง

$ sudo systemctl list-units -t service

การตรวจสอบ port ที่มีการเปิดใช้งานสำหรับ service ต่างๆ ด้วยคำสั่ง

$ sudo ss –tulpn

การปิด service ที่ไม่ต้องการใช้งาน

$ sudo systemctl stop SERVICE_NAME
$ sudo systemctl disable SERVICE_NAME

การลบ package ที่ไม่ต้องการใช้งาน

$ sudo yum remove PACKAGE_NAME

สำหรับผู้ใช้งาน x86_64 หากต้องการลบ package สำหรับ i386/i686 สามารถทำได้โดย

$ sudo yum remove *.i?86

และเพิ่มค่าตามด้านล่างนี้ที่ไฟล์ /etc/yum.conf เพื่อหากมีการใช้งานคำสั่ง yum จะไม่มีการ update ไฟล์ i386/i686

exclude = *.i?86

การ update ระบบ

การ update package ต่างๆ ที่ใช้งานบน server ถือเป็นเรื่องสำคัญอย่างยิ่งที่ผู้ดูแลระบบควรดำเนินการอย่างสม่ำเสมอ ทั้งนี้ โดยปกติโปรแกรมต่างๆ มักจะมีการ update ช่องโหว่หรือ fix bug อย่างต่อเนื่องอยู่แล้ว

ทั้งนี้สามารถ update ได้จากคำสั่ง

$ sudo yum -y update

หรือเพื่อให้มีการ update อย่างต่อเนื่อง สามารถกำหนดเป็น cron job โดยการติดตั้ง yum-cron

$ sudo yum install -y yum-cron

แก้ไขที่ไฟล์

$ sudoedit /etc/yum/yum-cron.conf 

จากนั้นให้ใส่รหัสผ่านของ user ที่ใช้งาน ณ. ขณะนั้น  และดำเนินการ เปลี่นค่าจาก apply_updates = no เป็น apply_updates = yes

ซึ่ง yum-cron จะมีการทำงานทุกวัน ตาม cron.daily ของระบบ ดังนั้นระบบจะมีการ update อย่างสม่ำเสมอ

อีกทั้งผู้ดูแลระบบสามารถรับข่าวสารจาก NSA (National Security Agency) หรือ CentOS-Announce mailing list เพื่อติดตามการ update หรือช่องโหว่ต่างๆ ได้อีกด้วย

กรณีที่มีการ update kernel นั้น จำเป็นต้องมีการ reboot server เพื่อใช้มีการใช้งาน kernel ตัวใหม่

การกำหนดรูปแบบของรหัสผ่าน

ก่อนที่จะเริ่มต้นสร้าง user สำหรับใช้งาน เบื้องต้นเราควรกำหนดรูปแบบของรหัสผ่านของ user เพื่อเพิ่มความปลอดภัยในการใช้งาน โดยรูปแบบของรหัสผ่านที่ปลอดภัย เช่น

  • ควรมี อักษรตัวพิมพ์เล็ก, อักษรตัวพิมพ์ใหญ่, ตัวเลข, อักขระพิเศษ (เช่น $%&@ เป็นต้น) และควรมีความยาวเกินกว่า 8 ตัวอักษร
  • ควรมีรูปแบบที่ยากต่อการคาดเดา รูปแบบการกำหนดทีไม่ใช่การจัดเรียงที่เป็นรูปแบบคำที่ง่ายมากจนเกินไป
  • ควรมีการเปลี่ยนรหัสผ่านอย่างสม่ำเสมอเช่น ทุกๆ 60, 90 หรือ 180 วัน
  • ไม่ควรมีการเปลี่ยนรหัสผ่านมากกว่า 2 ครั้งใน 1 วัน

กำหนดเมื่อมีการสร้าง user ใหม่

โดยให้รหัสผ่านมีอายุ 60 วัน

# perl -npe 's/PASS_MAX_DAYS\s+99999/PASS_MAX_DAYS 60/' -i /etc/login.defs

และอนุญาติให้สามารถเปลี่ยนรหัสผ่านได้ 2 ครั้งใน 1 วัน

# perl -npe 's/PASS_MIN_DAYS\s+0/PASS_MIN_DAYS 2/g' -i /etc/login.defs

กำหนดเพื่อใช้เมื่อมีการเปลี่ยนแปลงรหัสผ่าน โดยกำหนดไม่ให้มีการใช้งานรหัสผ่านซ้ำเดิมสำหรับรุ่น 5 ในอดีต

# vi /etc/pam.d/system-auth

(ประมาณ บรรทัดที่ 15) 

...
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok 
remember=5
...

กำหนดข้อบังคับเมื่อ user มีการกำหนดรหัสผ่าน

# vi /etc/security/pwquality.conf 
...
minlen = 8  # รหัสผ่านต้องมีจำนวนตัวอักษรอย่างน้อย 8 ตัวอักษร
lcredit = 1  # รหัสผ่านต้องมีจำนวนตัวอักษรภาษาอังกฤษพิมพ์เล็กอย่างน้อย 1 ตัวอักษร
ucredit = 1  # รหัสผ่านต้องมีจำนวนตัวอักษรภาษาอังกฤษพิมพ์ใหญ่อย่างน้อย 1 ตัวอักษร
dcredit = 1  # รหัสผ่านต้องมีจำนวนตัวเลขเล็กอย่างน้อย 1 ตัว
ocredit = 1  # รหัสผ่านต้องมีจำนวนอักขระพิเศษอย่างน้อย 1 ตัว
difok=4      # รหัสผ่านต้องมีการกำหนดจำนวนอักขระที่ต้องต่างจากรหัสผ่านก่อนหน้านี้จำนวน 4 ตัว

เมื่อกำหนดค่าเรียนร้อยให้ บันทึกไฟล์ดังกล่าว

การ update ระบบให้มีการเข้ารหัสแบบ SHA512 แทน MD5

# authconfig --passalgo=sha512 --update
# authconfig --test | grep hashing 
password hashing algorithm is sha512

ทดสอบเปลี่ยนรหัสผ่านที่ง่ายต่อการคาดเดา เช่น ตัวเลข 3-4 ตัว จะไม่สามารถกำหนดได้

[user01]$ passwd
Changingรหัสผ่านfor user user01.
Changingรหัสผ่านfor user01.
(current) UNIX password: 
New password: 
BAD PASSWORD: Theรหัสผ่านis shorter than 7 characters
New password: 
BAD PASSWORD: Theรหัสผ่านis shorter than 7 characters
New password: 
BAD PASSWORD: Theรหัสผ่านis shorter than 7 characters
passwd: Have exhausted maximum number of retries for service

ตรวจสอบรายละเอียดของ user

# chage -l user01
Last password change                                : Jul 02, 2017
Password expires                                    : Aug 31, 2017
Password inactive                                   : never
Account expires                                     : never
Minimum number of days betweenรหัสผ่านchange          : 2
Maximum number of days betweenรหัสผ่านchange          : 60
Number of days of warning beforeรหัสผ่านexpires       : 7

กำหนดสิทธิ์ user ที่ใช้งาน

ในการกำหนดสิทธิ์การใช้งานให้แต่ละ user ในระบบ ควรกำหนดให้อยู่ในขอบเขตที่ต้องการใช้งานเท่านั้น โดย user ที่สำคัญและมีสิทธิ์สูงที่สุดในระบบคือ user: root ซึ่งผู้ดูแลระบบนิยมใช้ในการจัดการระบบ และเนื่องด้วยสิทธิ์สูงสุดที่สามารถดำเนินการใดๆ ได้โดยไม่มีข้อยกเว้น ดังนั้นอาจจะส่งผลกระทบ กรณีที่เกิดข้อผิดพลาดในการใช้งานได้

เพื่อความปลอดภัย จึงควรสร้าง user ตามหน้าที่ ที่ต้องการใช้งาน และสำหรับผู้ดูแลระบบนั้นสามารถจัดการระบบได้ผ่าน คำสั่ง sudo

ตัวอย่างการสร้าง user สำหรับผู้ดูแลระบบ

# useradd admin01 && passwd admin01
Changing password for user admin01.
New password:  กำหนดรหัสผ่านที่ต้องการ
Retype new password: กำหนดรหัสผ่านที่ต้องการอีกครั้ง
passwd: all authentication tokens updated successfully.

กำหนดให้ใช้งานใน group ของ wheel

# usermod -aG wheel admin01

ตรวจสอบรายละเอียดของ user

# id admin01
uid=1001(admin01) gid=1001(admin01) groups=1001(admin01),10(wheel)

ทดสอบ run คำสั่งที่เป็นสิทธิ์ของ root เช่น

[admin01]$ sudo iptables -L –nv
[sudo] password for admin01: ใส่ค่ารหัสผ่านของ admin01 และ รอดู output ของการ run คำสั้ง
ซึ่งหากใส่รหัสผ่านถูกต้องจะสามารถตรวจสอบค่าดังกล่าวได้ 

ทั้งนี้กรณีที่ต้องการสร้าง user แต่ไม่ต้องการให้สามารถ shell ใช้งาน server ได้ สามารถกำหนดได้ดังนี้

# usermod -s /bin/false username
# useradd -s /usr/sbin/nologin username

การกำหนดค่า permission ของไฟล์ด้วย umask

ค่า umask หรือค่า user file-creation mode mask ใช้สำหรับกำหนดค่าตั้งต้นสำหรับ permission ของไฟล์นั้นๆ เมื่อมีการสร้างไฟล์ขึ้นใหม่ ซึ่งประกอบด้วยตัวเลข 4 หลัก(หลักซ้ายสุด มีค่า default เป็น 0) ซึ่งสามารถกำหนดได้โดย

– Symbolic values

เช่น umask u=rwx,g=,o=  ซึ่งกลุ่มชุดตัวอักษรหมายถึง

r : read

w : write

x : execute

u : user คือเจ้าของไฟล์

g : group ของเจ้าของไฟล์

o : กลุ่ม user อื่น

– Octal values

เช่น umask 027  ซึ่งกล่มชุดตัวเลขหมายถึง

0 : Full permissions (Read, Write, Execute)

1 : Write and read

2 : Read and execute

3 : Read only

4 : Write and execute

5 : Write only

6 : Execute onlyadminadmin

7 : No permissions

สำหรับค่า default ของ umask จะมีค่าเป็น 0022 (022) หรือ 0002 (002)

ซึ่งผู้ดูแลระบบสามารถกำหนดค่า umask สำหรับทุกๆ user (ค่า global) เมื่อมีการสร้างไฟล์ใหม่เพื่อให้มีความปลอดภัยเพิ่มขึ้นได้ที่ /etc/profile

# sudo perl -npe 's/umask\s+0\d2/umask 027/g' -i /etc/profile

หรือสามารถเจาะจงสำหรับแต่ละ user ได้ที่ไฟล์ ~/.bashrc ของ user นั้นๆ

$ perl -npe 's/umask\s+0\d2/umask 027/g' -i ~/.bashrc

ตัวอย่างการทดสอบสร้างไฟล์มีการกำหนดค่า umask 027 แล้ว

[admin01]$ mkdir directory
[admin01]$ touch file
[admin01]$ ls -l
total 4
drwxr-x--- 2 admin01 admin01 4096 Jul  2 14:21 directory
-rw-r----- 1 admin01 admin01    0 Jul  2 14:21 file

จะเห็นได้ว่า เมื่อมีการสร้างไฟล์หรือไดเรกทอรี จะมีการจำกัดสิทธิ์ของผู้ที่สามารถใช้งานได้ ได้อย่างมีขอบเขตยิ่งขึ้น

ทั้งนี้กรณีที่ต้องการเปลี่ยนแปลง permission ของไฟล์ สามารถเปลี่ยนได้จากคำสั้ง chmod

แต่ไม่ควรกำหนดค่าด้วย chmod 777 โดยค่าดังกล่าวหมายถึง ทุก user บนระบบสามารถอ่าน, เขียนและแก้ไขไฟล์หรือไดเรกทอรีนั้นๆได้ ซึ่งถือว่าไม่ปลอดภัยอย่างยิ่ง

การกำหนดให้มีการ logout โดยอัตโนมัติ

เมื่อผู้ดูแลระบบหรือ user มีการ login เข้าสู่ในระบบ และเมื่อดำเนินการส่วนต่างๆ เรียบร้อย อาจไม่มีการ logout หรือใช้งานต่อ แต่สถานะยังคงมี connection ค้างอยู่

ทั้งนี้ สามารถกำหนดให้มีการ logout user โดยอัตโนมัติได้ หาก user นั้นๆ ไม่มีการดำเนินการใดๆ ในช่วงเวลาที่กำหนด โดยสร้างไฟล์ /etc/profile.d/autologout.sh และกำหนดค่า ตามด้านล่าง

$ sudo vi /etc/profile.d/autologout.sh
TMOUT=600  
readonly TMOUT
export TMOUT

จากนั้นให้บันทึกไฟล์ และกำหนดให้สามารถ execute ไฟล์ได้

$ sudo chmod +x /etc/profile.d/autologout.sh

จากการกำหนดค่า หมายถึงจะมีการยกเลิกการใช้งาน user ออกจากระบบ หากไม่มีการใช้งานหรือดำเนินการใดภายใน 10 นาที เป็นต้น

การเพิ่มความปลอดภัยให้ Secured Shell service

ในการใช้งาน linux server เพื่อให้สามารถจัดการระบบได้อย่างสะดวกยิ่งขึ้น service ที่จำเป็นต้องเปิดใช้งานตัวหนึ่งคือ sshd service ทั้งนี้เราสามารถปรับค่าต่างๆ ในการใช้งาน เพื่อให้การ remote server ปลอดภัยขึ้นได้ ดังนี้

เตรียม ทำการสร้าง public key จากเครื่องที่ต้องการใช้เป็นเครื่อง client ซึ่ง ssh เข้าสู่ server

Linux client

Run คำสั่งด้วย user ที่ต้องการ remote จาก client ไปยัง server

Client $ ssh-keygen -b 4096

และกด Enter เพื่อใช้ชื่อ default คือ id_rsa และ id_rsa.pub โดยไฟล์จะสร้างและวางไว้ที่ $HOME/USERNAME/.ssh

เมื่อได้ไฟล์ public key เรียบร้อยแล้ว ให้นำไฟล์นี้ไปติดตั้งยังเครื่อง server ด้วยคำสั่ง

Client $ ssh-copy-id example_user@SERVER_IP
หรือ
Client $ scp ~/.ssh/id_rsa.pub example_user@SERVER_IP:~/.ssh/authorized_keys

Windows client

สามารถเลือกใช้การ generate key ผ่านโปรแกรม

1) winscp

2) putty

เมื่อนำไฟล์ public key ไปวางบน server เรียบร้อยแล้ว ให้เปลี่ยน permission ของไฟล์ให้ถูกต้อง

example_user@Server $ sudo chmod 700 -R ~/.ssh && chmod 600 ~/.ssh/authorized_keys

เปิดไฟล์ /etc/ssh/sshd_config ที่ server เพื่อทำการปรับค่าดังนี้

# เปลี่ยนเป็น port อื่นที่ไม่ใช่ port default คือ 22 ทั้งนี้ ควรเป็น port ที่ไม่มีการใช้งานซ้อนทับกับ port อื่นๆ 
ในตัวอย่างนี้ เราปรับ default port ของ sshd เป็น 2022
Port 2022

# กรณีที่มีการปิดการใช้งาน ควรเปิดการใช้งานและเปลี่ยนเป็น no เพื่อปฏิเสธการ shell เข้าระบบด้วย user: root
PermitRootLogin no 

# กรณีที่มีการปิดการใช้งาน ควรเปิดการใช้งาน และกำหนดค่า เป็น Protocol 2 เนื่องจาก Protocol 1 
มีการใช้งานมานานแล้วและไม่ปลอดภัยแล้ว
Protocol 2 

#กำหนด user ที่สามารถ shell เข้าระบบได้
AllowUsers admin01 admin02 

#กำหนดให้ไม่สามารถ shell เข้าระบบด้วยการใส่ค่ารหัสผ่านได้
PasswordAuthentication no 

#กำหนดให้ shell เข้าระบบต้องใช้ค่า public key เท่านั้น
PubkeyAuthentication yes 

และ save ไฟล์ให้เรียบร้อย

โดยก่อนทำการ restart service ให้ทำการเปิด port ใหม่ที่จะใช้งานสำหรับ SSH ให้เรียบร้อย

คำสั่งกรณีที่มีการใช้งาน FirewallD

$ sudo firewall-cmd --permanent --zone=public --add-port=2202/tcp
$ sudo firewall-cmd --reload

เมื่อปรับค่าต่างๆ เรียบร้อยจึงทำการ restart service

$ sudo systemctl restart sshd.service

การใช้งาน Firewall

เมื่อมีการนำ server ไปใช้งานเป็น production หรือ public สิ่งที่จำเป็นและช่วยป้องการ server ได้ดียิ่งขึ้นคือ firewall       สำหรับ centos 7 จะมี FirewallD ให้ใช้งาน หรือสามารถเลือกงาน iptables ได้เช่นกัน

ในปัจจุบันจะมี firewall ให้เลือกใช้งานอย่างหลากหลาย โดยที่นิยมใช้งานเช่น CSF, IPCop, Shorewall เป็นต้น ซึ่งสามารถเลือกใช้งานได้ตามแต่ลักษณะของ server เพื่อความเหมาะสม

การปรับค่าของ Kernel

ทั้งนี้อีกส่วนบน server ที่สามารถปรับค่าได้คือ Kernel ของระบบนั้น โดยสามารถปรับค่าของ Kernel ได้ที่ไฟล์ /etc/sysctl.conf

ตัวอย่างการปรับค่า เช่น

#ยกเลิกการใช้งาน IPv4 forwarding
ipv4.conf.all.forwarding=0

#ยกเลิกการใช้งาน Source Routing
net.ipv4.conf.all.accept_source_route=0

#ยกเลิกการใช้งาน IPv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

#ยกเลิกการใช้งาน Reverse Path Forwarding
net.ipv4.conf.all.rp_filter=2

และทำการ reload config อีกครั้ง

$ sudo sysctl -p /etc/sysctl.conf

จากตัวอย่างของการปรับแต่งค่าต่างๆ ข้างต้นที่ได้กล่าวมาทั้งหมดในบนความนี้ เป็นเพียงบางส่วนที่สามารถช่วยป้องกันให้ server ปลอดภัยขึ้นได้ อย่างไรก็ดี การปรับค่าในส่วนของการใช้งานตาม service ต่างๆ บน server เอง ก็มีความสำคัญ ทั้งนี้เนื่องจากความต้องการในการใช้งาน server ในแต่ละระบบมีความแตกต่างกัน ดังนั้นผู้ดูแลระบบต้องเลือกปรับค่าต่างๆ ตามความเหมาะสมเพื่อให้สามารถใช้งาน server ได้อย่างมีประสิทธิ์ภาพ

ข้อมูลเพิ่มเติม https://wiki.centos.org/HowTos