ก๊วนซอฟท์แวร์ </softganz> SoftGang (Gang Software)

Web &amp; Software Developer Gang.

Topic List

โดย Little Bear on 3 เม.ย. 55 17:07

อันนี้ copy มาล้วน ๆ ครับ ยังไม่มีความสามารถพอที่จะเขียนอย่างนี้ได้

เอามาจาก www.thaihosttalk.com ตามนี้นะครับ

นี่เป็นเกร็ดเล็กๆน้อยๆเบื้องต้นสำหรับมือใหม่ที่จะช่วยปรับแต่งให้เครื่อง Linux มีความปลอดภัยมากยิ่งขึ้นครับ โดยตัวอย่างที่ให้เป็นคำสั่งบนเครื่อง debian ถ้าใครใช้ distro อื่นๆก็อาจจะมีรายละเอียดปลีกย่อยแตกต่างกันไป (ส่วนใหญ่จะคล้ายๆกันแต่ต่างกันที่สถานที่เก็บ config ไฟล์ต่างๆ) ผิดพลาดประการใดก็ขออภัยด้วยครับ

แบ่งขั้นตอนคร่าวๆได้ดังนี้

  1. สร้าง user ขึ้นมาใหม่ - เพื่อที่จะได้ไม่ต้องเข้าเป็น root ตลอดเวลา ช่วยทั้งเรื่องความปลอดภัยและป้องกันความซุ่มซ่ามของตัวเองทำเครื่องพังจากการใช้คำสั่งอย่างไม่ระมัดระวัง
  2. เปลี่ยน root password - โดยเฉพาะคนที่ได้ root password มาจากคนอื่น (แต่ถ้าเราเปลี่ยนแล้ว คนๆนั้นก็จะเข้า root ไม่ได้นะครับ เว้นแต่ว่าจะให้สิทธิ์ใน sudoers ไว้ตามข้างล่าง)
  3. ปิด service ต่างๆที่ไม่ได้ใช้ - เพื่อลดจำนวนช่องโหว่ลง
  4. ลง sudo - จะได้ไม่ต้อง login เข้า root ตามข้อ (1) ข้างบน
  5. ตั้งค่า SSH - ไม่ให้ login โดยใช้ root และทำ public key authentication (ถ้าต้องการ)
  6. ตั้งค่า iptables - เพื่อเปิดใช้เฉพาะ port ที่จำเป็นจริงๆ

มาเริ่มกันเลยดีกว่า..

1. สร้าง user โดยใช้คำสั่ง adduser

$ adduser username
$ passwd username

2. เปลี่ยน root password

$ passwd

3. ปิด service ต่าง ๆ ที่ไม่ได้ใช้

ปกติผมจะไปเพิ่มหรือลบ symbolic link ตาม /etc/rcX.d/ เอาด้วยความเคยชิน แต่เดี๋ยวนี้ใช้สคริปต์ update-rc.d ได้ครับ (สำหรับ debian) หรือ 'service' สำหรับ Centos

$ update-rc.d -f service_name remove

4. ลง sudo

$ apt-get install sudo

หรือใครใช้ Centos ก็ให้ใช้ yum เอา

จากนั้นก็ให้ใช้ visudo เพื่อแก้ไฟล์ sudoers อยากให้ใครใช้คำสั่งที่ต้องใช้ root privilege ได้ก็ใส่บรรทัดนี้เข้าไป

username ALL=(ALL)

5. ตั้งค่า SSH

อันดับแรกที่ผมทำเลยคือปิด root login ครับ ให้เข้ามาเป็น user ธรรมดาแล้วมา sudo เอา เปิดไฟล์ /etc/ssh/sshd_config โดยใช้ editor ที่ถนัด แล้วมองหาบรรทัด PermitRootLogin yes แล้วเปลี่ยนเป็น PermitRootLogin no แทน

จากนั้นก็เช็คว่าให้ใช้ SSH version 2 เท่านั้น โดยดูในไฟล์เดิมแล้วหาบรรทัด Protocol 2,1 แล้วเปลี่ยนเป็น Protocol 2 แทน ถ้าเป็น Protocol 2 อยู่แล้วก็ไม่ต้องไปยุ่งอะไรมันครับ

ถ้าอยากจะเปลี่ยน port SSH ด้วยก็ทำได้ครับ หาบรรทัด Port 22 แล้วเปลี่ยนเลข 22 เป็น port อื่นที่เราต้องการ

สำหรับคนที่โรคจิตวิตกจริตอย่างผมก็อาจจะอยากใช้ public key authentication แทน ก็ทำได้ครับ ก่อนอื่นก็สร้าง public/private key บนเครื่องตัวเองก่อน

$ ssh-keygen -t rsa

และควรจะใส่ password ให้กับ key นี้ด้วยเพื่อเพิ่มความปลอดภัย (ไม่งั้นถ้า private key โดนขโมย คนที่ขโมยก็จะสามารถเข้าเครื่องเราได้ทันที)

จากนั้นก็ upload public key ขึ้นไปบน server

$ scp id_rsa.pub username@server:id_rsa.pub

แล้ว log เข้าไปที่ server เพื่อตั้งให้ใช้ key นี้สำหรับ login

$ cd (ไปที่ home ของ user ที่ต้องการ)
$ mkdir .ssh
$ chmod 700 .ssh
$ cat id_rsa.pub >> .ssh/authorized_keys
$ chmod 600 .ssh/authorized_keys

แล้วเปิดไฟล์ /etc/ssh/sshd_config ขึ้นมาอีกครั้งเพื่อตั้งให้ใช้ public key เท่านั้น

หาบรรทัด PasswordAuthentication yes แล้วเปลี่ยนเป็น PasswordAuthentication no

หาบรรทัด UsePAM yes แล้วเปลี่ยนเป็น UsePAM no

ถ้ามั่นใจว่าไม่ได้ทำอะไรผิดก็ทำการ restart sshd

$ /etc/init.d/ssh restart

*** ควรจะทำที่หน้าจอหรือผ่าน iKVM เพราะถ้า config พลาดอาจจะทำให้เข้าเครื่องไม่ได้ (เตือนแล้วนะครับ) หรือถ้าจำเป็นจริงๆที่ต้องทำจากข้างนอกก็ต้องไม่ปิด session ssh ปัจจุบันจนกว่าจะมั่นใจว่าสามารถเข้า session ใหม่ผ่าน public key ได้ ***

6. ตั้งค่า iptables

โดยปกติผมจะปิดทุก port ยกเว้นแต่ port ที่ต้องใช้จริงๆ ขั้นตอนต่อไปจะทำในไฟล์หรือใส่ command เข้าไปเลยก็ได้ ถ้าสร้างไฟล์ก็ให้เริ่มไฟล์ด้วย *filter เพื่อบอกว่าเรากำลังแก้ filter table อยู่ ดังนี้

$ vi /etc/iptables.test.rules
*filter
-A INPUT -i lo -j ACCEPT
-A INPUT -i ! lo -d 127.0.0.0/8 -j REJECT
-A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT
-A OUTPUT -j ACCEPT
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j DROP
-A FORWARD -j DROP

COMMIT

อธิบาย rules ต่างๆ

  1. อนุญาต traffic จาก loopback interface
  2. ถ้ามี traffic มาที่ 127.0.0.0/8 ต้องมาจาก loopback interface เท่านั้น
  3. อนุญาต incoming traffic ที่เริ่มจากเครื่องนี้
  4. อนุญาต outgoing traffic ทั้งหมด
  5. อนุญาต tcp traffic ที่มาที่ port 80
  6. อนุญาต tcp traffic ที่มาที่ port 22 (SSH)
  7. อนุญาต ping
  8. เก็บ log traffic ที่ไม่ได้รับอนุญาต
  9. drop incoming traffic อื่นๆ
  10. drop traffic อื่นๆ ที่จะต้องถูก forward

เสร็จแล้วก็ load เข้า iptables โดยคำสั่ง

$ iptables-restore < /etc/iptables.test.rules

หรือถ้าไม่ทำใส่ไฟล์ก็ให้ใช้คำสั่ง iptables นำหน้าแทนครับ เช่น

$ iptables -A INPUT -i lo -j ACCEPT

แล้วใส่เข้าไปทีละบรรทัด

จากนั้นก็ดูความเรียบร้อย

$ iptables -L

และลองดูว่า port ที่ต้องการจะใช้ใช้ได้จริงหรือเปล่า และ port อื่นๆได้ถูกปิดไปจริงหรือไม่ (สำหรับคนที่เปลี่ยน port ssh ก็อย่าลืมเปลี่ยนตามนะครับ) ถ้าเรียบร้อยดีก็ save ไป

$ iptables-save > /etc/iptables.up.rules

แล้วสร้าง script ขึ้นมาเพื่อโหลด rules ตอน boot

$vi /etc/network/if-pre-up.d/iptables
#!/bin/bash
/sbin/iptables-restore < /etc/iptables.up.rules

save ไฟล์แล้วเปลี่ยน permission ให้เป็น executable

$ chmod +x /etc/network/if-pre-up.d/iptables

เป็นอันเสร็จเรียบร้อย

(ลอกมาจาก blog ตัวเอง + update นิดหน่อย) original ที่นี่ http://just-another-...ลอดภัยให้-debi/

ที่มา www.thaihosttalk.com

โดย Little Bear on 24 พ.ย. 54 02:38

มีคนแนะนำว่าให้เลิกใช้ swap หาก RAM หมด ก็ปล่อยให้มันเดี้ยง ดีกว่าให้มันเขียนลง swap วันนี้ก็เลยลองของสักหน่อย พรุ่งนี้ก็จะรู้ผล

วิธีการคือ

ปิดมันทุก swap

root@god# swapoff -a

ปิด swap เฉพาะ

root@god# swapoff /dev/partition

โดยดู partition จาก

root@god# fdisk -l

หากอยากให้ปิดถาวรก็ต้องแก้ไขใน /etc/fstab

โดย Little Bear on 17 พ.ย. 54 01:43

DirectAdmin ตั้งแต่เวอร์ชัน 1.39 เป็นต้นไป ได้เพิ่มความสามารถในการตรวจสอบการ Brute Force หรือการเดาสุ่มรหัสผ่านไปเรื่อยๆ (รายละเอียด) แต่สิ่งหนึ่งที่ DirectAdmin ไม่ได้ทำมาให้คือ ทำการแบนไอพีที่มา Brute Force เราโดยอัตโนมัติ ทำให้ DirectAdmin ทำได้เพียงแค่แจ้งเตือนว่ามีไอพีใด Brute Force เครื่องเราเรื่อยๆ โดยไม่ได้มีประโยชน์อันใดเพิ่มขึ้นมา (นอกจากทำให้รำคาญอีเมลแจ้งเตือน) เพราะฉะนั้นบทความนี้จะมาบอกถึงขั้นตอนทำให้ DirectAdmin แบนไอพีที่มา Brute Force โดยอัตโนมัติ โดยลินุกซ์ดิสโทรที่ผมใช้คือ Debian 6 64-bit ถ้าใช้ CentOS ลองทำตามขั้นตอนที่นี่ดูครับ

ขั้นแรกให้ลง iptables ก่อนด้วยคำสั่ง

apt-get install iptables

จากนั้นเราจะสร้างสคริปต์ blockip.sh ไว้ที่ /usr/local/directadmin/scripts/custom/blockip.sh โดยมีเนื้อหาตามนี้ครับ

#666666; font-style: italic;">#!/bin/sh

curriptables#7a0874; font-weight: bold;">(#7a0874; font-weight: bold;">) #7a0874; font-weight: bold;">{         #7a0874; font-weight: bold;">echo #ff0000;">"<br><br><textarea cols=160 rows=60>";         #000000; font-weight: bold;">/sbin#000000; font-weight: bold;">/iptables #660033;">-nL

        #7a0874; font-weight: bold;">echo #ff0000;">"</textarea>"; #7a0874; font-weight: bold;">}
#666666; font-style: italic;">### Make sure it's not already blocked #007800;">COUNT=#000000; font-weight: bold;"></span><span style="color: <a class="hashtag" href="/tags/c20cb9">#c20cb9</a>; font-weight: bold;">grep</span> <span style="color: <a class="hashtag" href="/tags/660033">#660033</a>;">-c</span> <span style="color: <a class="hashtag" href="/tags/007800">#007800</a>;">$ip</span> <span style="color: <a class="hashtag" href="/tags/000000">#000000</a>; font-weight: bold;">/</span>etc<span style="color: <a class="hashtag" href="/tags/000000">#000000</a>; font-weight: bold;">/</span>network<span style="color: <a class="hashtag" href="/tags/000000">#000000</a>; font-weight: bold;">/</span>iptables.save<span style="color: <a class="hashtag" href="/tags/000000">#000000</a>; font-weight: bold;">;

#000000; font-weight: bold;">if #7a0874; font-weight: bold;">[ #ff0000;">"#007800;">$COUNT" #660033;">-ne #000000;">0 #7a0874; font-weight: bold;">]; #000000; font-weight: bold;">then         #7a0874; font-weight: bold;">echo #ff0000;">"#007800;">$ip already exists in iptables (#007800;">$COUNT). Not blocking.";         curriptables         #7a0874; font-weight: bold;">exit #000000;">2;

#000000; font-weight: bold;">fi
#7a0874; font-weight: bold;">echo #ff0000;">"Adding #007800;">$ip to iptables...<br>"; #000000; font-weight: bold;">/sbin#000000; font-weight: bold;">/iptables #660033;">-I INPUT #660033;">-s #007800;">$ip #660033;">-j DROP

#000000; font-weight: bold;">/sbin#000000; font-weight: bold;">/iptables-save #000000; font-weight: bold;">> #000000; font-weight: bold;">/etc#000000; font-weight: bold;">/network#000000; font-weight: bold;">/iptables.save
#7a0874; font-weight: bold;">echo #ff0000;">"<br><br>Result:"; curriptables

#7a0874; font-weight: bold;">exit #000000;">0;




เสร็จแล้วรันคำสั่ง

chmod 700 /usr/local/directadmin/scripts/custom/block_ip.sh

ซึ่งสคริปต์นี้จะทำให้เราสามารถสั่ง block ip ผ่านหน้าจัดการใน DirectAdmin ได้ โดยให้ไปที่เมนู Brute Force Monitor แล้วกดลิงก์ IP Info ของไอพีที่เราต้องการบล็อก หลังจากนั้นให้กดปุ่ม Block This IP ที่ด้านล่างสุด

ถ้าต้องการให้ iptables ถูก restore ข้อมูลใหม่ทุกครั้งที่ reboot เครื่อง ให้ใส่

post-up iptables-restore /etc/network/iptables.save

ลงไปที่ด้านท้ายของไฟล์ /etc/network/interfaces

ถ้าต้องการให้ DirectAdmin ทำการ block ip อัตโนมัติ โดยไม่ต้องมากดปุ่ม Block This IP เอง ให้สร้างไฟล์ /usr/local/directadmin/scripts/custom/bruteforcenotice_ip.sh และใส่เนื้อหาตามนี้

#!/bin/sh
SCRIPT=/usr/local/directadmin/scripts/custom/block_ip.sh
ip=$value $SCRIPT
exit $?;

เสร็จแล้วรันคำสั่ง

chmod 700 /usr/local/directadmin/scripts/custom/brute_force_notice_ip.sh

โดยจำนวนการ Brute Force ก่อนที่จะโดน block ip นั้น สามารถตั้งได้ที่เมนู Administrator Settings > Notify Admins after an IP has และใส่จำนวนที่ต้องการลงไปครับ

ถ้าต้องการยกเลิก block ip อาจจะต้องเข้ามาพิมพ์คำสั่งยกเลิกด้วยตัวเองไปก่อนครับ ด้วยคำสั่งนี้

iptables -D INPUT -s xxx.xxx.xxx.xxx -j DROP
iptables-save > /etc/network/iptables.save

เปลี่ยน xxx.xxx.xxx.xxx เป็น ip ที่เราต้องการยกเลิก block

ที่มา: วิธีการตั้งค่าให้ DirectAdmin Block IP อัตโนมัติเมื่อตรวจพบการ Brute Force บน Debian 6 64-bit , I wish to have a block_ip.sh so I can block IPs through DirectAdmin , How to block an IP in Linux

โดย Little Bear on 20 ก.ย. 54 22:25

ตอนนี้ server มีปัญหาเรื่อง Load ในบางช่วงที่สูงผิดปกติ แต่ยังหาสาเหตุไม่เจอ

คุณ icez เขียนเรื่อง เครื่องมือดูสถานะระบบอย่างละเอียด (centos) ไว้ที่ thaihosttalk.com เลยขอเอาลิงก์มาเก็บไว้ก่อน ไว้ค่อยเขียนรายละเอียดอีกที

โดย Little Bear on 4 ส.ค. 54 14:13

suPHP และ PHP cgi ไม่สามารถเปลี่ยนค่า config โดย .htaccess ได้ จึงต้องใช้วิธีการเพิ่ม config โดยให้ php ไปอ่านจากไฟล์เพิ่มเติม

เริ่มด้วยการสร้างไฟล์ php.ini ไว้ใน /usr/local/directadmin/data/users/(username)/php/php.ini

แล้วเพิ่มใน Apache ว่า

SetEnv PHP_INI_SCAN_DIR /usr/local/directadmin/data/users/|USER|/php/

ที่มา DirectAdmin