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

Web &amp; Software Developer Gang.

Topic List

โดย Little Bear on 16 พ.ค. 56 18:20

เหตุเกิดจากว่า server ที่วางอยู่ใน ม.อ. ไม่อนุญาตให้ FTP จากภายนอกมหาวิทยาลัยได้ ต้องเข้าไปนั่งในมหาวิทยาลัยเท่านั้นจึงจะใช้งาน FTP ได้

แต่เว็บที่ดูแลอยู่มีปัญหาแค่ว่า folder สำหรับ upload ไฟล์นั้นได้ถูกกำหนด permission ไว้ที่ 755 ทำให้ไม่สามารถบันทึกภาพไว้ได้

นั่งคิดอยู่หลายตลบว่าจะทำยังไงดี ไม่อยากบึ่งรถไป ม.อ. ก็มาคิดได้ว่า CMS ที่เขียนไว้นั้น สามารถ run PHP ได้ และ PHP ก็มี function ftp และ ftp_chmod

ทางแก้จึงออกมาประมาณนี้

<?php
$ftp_server = "my.ftp.com";
$ftp_user_name = "myftpusername";
$ftp_user_pass = "myfppassword";

$conn_id = ftp_connect($ftp_server);
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

$folder="folder/to/chmod";

if (ftp_chmod($conn_id, 0777, $folder) !== false) {
 echo "$folder chmoded successfully to 777\n";
} else {
 echo "could not chmod $folder\n";
}

ftp_close($conn_id);
?>
โดย Little Bear on 16 พ.ค. 56 09:09

เคยสำรองข้อมูลบน DirectAdmin ด้วยคำสั่ง CMDSYSTEMBACKUP โดยตั้งเวลาไว้ให้ทำงานตอนตี 5 กว่า (กว่าจะสำรองเสร็จปาเข้าไปเกือบ 10 โมงเช้า) DA ทำสำรองข้อมูลของ MySql ด้วยคำสั่ง mysqldump ทำให้ load เยอะมากจนเว็บล่ม ยังหาทางแก้ปัญหาไม่ได้ ตั้งใจว่าจะแก้ปัญหาชั่วคราวโดยการเปลี่ยนเวลาในการ backup ไปเป็นตอนดึก ๆ แทน

แต่ปัญหาคือจำไม่ได้แล้วว่าเข้าไปกำหนดผ่านทางเมนูไหน (นานมาแล้ว)

และเพิ่งหาเจอว่าอยู่ที่

http://YOUR-IP:2222/CMD_SYSTEM_BACKUP

http://YOUR-IP:2222/CMD_ADMIN_BACKUP

เปลี่ยนเวลาเรียบร้อยแล้ว แต่ค่อยหาทางลด load อีกที

โดย Little Bear on 24 ม.ค. 56 21:06

อ่านเจอใน www.thaihosttalk.com ว่ามีการแทรก eval(based64 ไว้ในไฟล์ต่าง ๆ ในเว็บ เลยลองมาเช็คใน server ปรากฏว่าเจอจริง ๆ ด้วย 2 โดเมน คือ border9025.com และ sadao4u.com

โดยการ

  1. ค้นหาไฟล์ที่ถูกแทรกโค๊ด eval(based64 ด้วยคำสั่ง
grep -lr --include=*.php "eval(base64_decode" /home/(user|*)/domains/*/public_html/

คำสั่งนี้จะแสดงรายชื่อทุกไฟล์ในบัญชีนี้ ที่ถูกแทรกโค๊ด eval ออกมาทั้งหมด แล้วก็เข้าไปลบคำสั่งนั้นออกจากแต่ละไฟล์

  1. ใช้ avgscan /home/user เพื่อหาไฟล์ Backdoor ก่อน โปรแกรม avgscan จะหาพบ และจะบอกว่า มีไฟล์ backdoor เก็บไว้ที่โฟลเดอร์ไหน

ขอบคุณ www.hosttook.com

โดย Little Bear on 15 ม.ค. 56 20:10

คุณ icez เขียนไว้ที่ www.thaihosttalk.com ว่า

maxclients ของ apache สูตรคำนวณคือแรมหาร 50 ครับ แรม 24GB ก็เซตประมาณ 480 - 512 ไม่เกินนั้น

ส่วนของ my.cnf นี่บอกยากครับ หลักๆ ใช้ความรู้สึกเอามากกว่า

ด้านล่างนี้เป็นค่าเฉลี่ยสำหรับเครื่อง hosting ที่มีแรมมากกว่า 8GB ครับ ค่าที่ยังปรับเพิ่มได้อีกมี keybuffers กับ innodbbufferpoolsize นอกนั้นไม่ควรปรับเพิ่ม (max connections ปรับเพิ่มได้แต่ไม่เกิน 500 แต่ไม่แนะนำให้ปรับโดยเด็ดขาด)

[mysqld]
local-infile=0

innodb_buffer_pool_size=256M
innodb_additional_mem_pool_size=1M
innodb_log_buffer_size=500K
innodb_thread_concurrency=2
innodb_file_per_table

skip-character-set-client-handshake
skip-name-resolve
max_connections = 300
key_buffer = 512M
myisam_sort_buffer_size = 32M
join_buffer_size = 1M
read_buffer_size = 1M
sort_buffer_size = 2M
read_rnd_buffer_size = 1M

table_cache = 1536
thread_cache = 4
thread_concurrency = 2
thread_cache_size = 256
wait_timeout = 3600
connect_timeout = 10
max_tmp_tables = 256
tmp_table_size = 128M
max_allowed_packet = 16M
max_connect_errors = 10
query_cache_limit = 1M
query_cache_size = 32M
query_cache_type = 1
query_prealloc_size = 16384
query_alloc_block_size = 16384
max_heap_table_size = 128M

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
open_files_limit = 16384
โดย Little Bear on 28 ก.ค. 55 21:50

ยังไม่ได้ศึกษา IPv6 อย่างจริงจัง รู้เพียงแค่ว่าวันหนึ่งมาถึงแน่ ๆ วันนี้ไปอ่านที่คุณ icez เขียนไว้ที่ Basic IP(v6) for System Administrator ลองอ่านดูก็พอเข้าใจ แต่ตนเองใช้ Debian ไม่ใช่ CentOS คงต้องหาข้อมูลต่อไป แต่ก็ขอเก็บอันนี้ไว้ก่อนก็แล้วกัน

โดย Little Bear on 28 ก.ค. 55 16:27

สร้างไฟล์ /backup/backup.sh เขียน code ตามนี้

#!/bin/sh

DEST="/backup/daily"

if [ "$1" != "" ]; then
  DEST=$1
fi

echo "Backup to $DEST"

mkdir $DEST
START=$(date +%s)
rsync -avtp /* $DEST --delete --exclude-from=/backup/backup-exclude.txt
FINISH=$(date +%s)

echo "Backup to $DEST on $(date '+%A, %d %B %Y, %T') total time: $(( ($FINISH-$START) / 60 )) minutes, $(( ($FINISH-$START) % 60 )) seconds">>/backup/log/backup.log

สร้างไฟล์ /backup/backup-exclude.txt กำหนดชื่อโฟลเดอร์ที่ไม่ต้องการให้ backup

/backup/*
/dev/*
/proc/*
/sys/*
/tmp/*
/run/*
/mnt/*
/media/*
/lost+found
/home/*/.gvfs
var/log/httpd
var/spool

แล้วกำหนด cronjob ให้ทำงานทุกวันตอนตี 2

* 2 * * * /backup/backup.sh
โดย 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 3 เม.ย. 55 16:21

การติดตั้ง DirectAdmin บน CentOS 6 minimal ซึ่ง CentOS 6 minimal ไม่มี library พื้นฐานบางตัวมาให้โดยเฉพาะ mysql หลังจากลง CentOS เรียบร้อย ให้สั่ง update และติดตั้ง package เพิ่มเติม

yum update
rpm -Uvh http://mirrors.thzhost.com/epel/6/x86_64/epel-release-6-5.noarch.rpm
yum install gcc-c++ make patch screen wget quota ncftp bind bind-utils caching-nameserver which bison flex webalizer patch openssl-devel.x86_64 curl-devel.x86_64 e2fsprogs-devel.x86_64 perl-DBI ntp tcpdump iptables telnet traceroute rsync openssh-clients perl-Term-ReadKey autoconf rpm-build vim-enhanced nginx automake libaio libcurl-devel

หลังจากนั้นให้ติดตั้ง DirectAdmin ตามปกติ

คู่มือติดตั้ง CentOS 6

ที่มา www.thaihosttalk.com

โดย Little Bear on 30 มี.ค. 55 01:23
  • ส่งไป yahoo.com ได้
  • ส่งไป hotmail.com ได้บ้าง ไม่ได้บ้าง ตีกลับบ้าง
  • ส่งไป gmail.com ไม่ได้เลย ตีกลับตลอด

ข้อความตีกลับมา ก็ประมาณนี้ :

This message was created automatically by mail delivery software. A message that you sent could not be delivered to one or more of its recipients. This is a permanent error. The following address(es) failed: xxx@gmail.com     SMTP error from remote mail server after end of data:
    host gmail-smtp-in.l.google.com [209.85.225.27]:
    550-5.7.1 [202.129.16.49] The IP you're using to send mail is not authorized to
    550-5.7.1 send email directly to our servers. Please use the SMTP relay at your
    550-5.7.1 service provider instead. Learn more at
    550 5.7.1 http://support.google.com/mail/bin/answer.py?answer=10336 pa2si6663151igc.55 ------ This is a copy of the message, including all the headers. ------ Return-path:
Received: from localhost ([127.0.0.1] helo=www.napradu.go.th)
by s1.myhost.com with esmtpa (Exim 4.73)
(envelope-from )
id 1SDI7B-0006cP-5q
for xxx@gmail.com; Thu, 29 Mar 2012 23:22:21 +0700
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8;
format=flowed
Content-Transfer-Encoding: 7bit
Date: Thu, 29 Mar 2012 23:22:20 +0700
From: xxx@xxx.go.th
To:
Subject: =?UTF-8?Q?=E0=B8=97=E0=B8=94=E0=B8=AA=E0=B8=AD=E0=B8=9A=E0=B8=88?= =?UTF-8?Q?=E0=B8=B2=E0=B8=81=20softganz?=
Message-ID: <7f8a6ee0134f08296fbcd88e7b9deb7a@napradu.go.th>
X-Sender: xxx@xxx.go.th
User-Agent: Roundcube Webmail/0.7.2 Test

เท่าที่คาดไว้ สาเหตุ

  1. CAT เปลี่ยนอะไรบางอย่าง ทำให้ต้องกำหนดค่า Reverse DNS (จากเดิมที่เคยส่งเมล์ได้เป็นปกติ) ก็เลยติดต่อไปทาง CAT แจ้งข้อมูลไป แล้วก็คอยอีก 2-3 วัน ได้ทราบว่ามีการกำหนดให้แล้ว ลองตรวจดูกับ www.mxtoolbox.com ปรากฏว่าเรียบร้อย แต่ก็ยังส่งไม่ผ่านอยู่ดี

  2. อาจจะติด Black list เลยตรวจดูกับ ip-blacklist.e-dns.org ปรากฏว่าติดอยู่ 4 ที่ คือ Software Group Blackholes , APEWS Level 2 , Spamhaus PBL Policy Block List , Spamhaus ZEN Combined Block List ตัวที่คาดว่าอาจจะมีปัญหาคือ Spamhaus PBL Policy Block List

  3. ลองเข้าไปตรวจสอบดูที่ Spamhaus PBL Policy Block List อ่านได้ความประมาณว่า IP เราเป็น IP Dynamic ซึ่งเป็น IP ที่ไม่สามารถส่งเมล์ออกได้ เลยทำการขอลบ IP ออก แล้วคอยอีกประมาณ 1 ชั่วโมง

  4. ก็เริ่มจะส่งได้ hotmail.com ไปเข้า junk mail , gmail.com ไปเข้า junk mail ก็ยังดีที่ไม่โดน reject