Monday, June 10, 2024

How to find and kill a MySQL process

  • ปกติจะ kill process จาก phpmyadmin แต่มันค้างทำไงล่ะ
Solved
  • เข้าผ่าน CLI ด้วยสิทธิ์ที่ประมาณ root เลย
  • จากนั้นแสดง process list โดย
mysql > show processlist;
  • มันจะแสดงรายการ process mysql ที่กำลังดำเนินการอยู่ หน้าสุด จะแสดง id
  • ให้เรา เอา id นั้นมา ทำลายได้เลยโดย (สมมุติจะ kill id 123)
mysql > kill [id]
mysql > kill 123
Ref
  • https://phoenixnap.com/kb/how-to-kill-mysql-process
  • https://docs.pantheon.io/guides/mariadb-mysql/kill-mysql-queries

Wednesday, June 5, 2024

Firebase web push notify

Ref

https://www.youtube.com/watch?v=iz5arafmatc

https://firebase.google.com/docs/cloud-messaging/concept-options

https://www.youtube.com/watch?v=r7vBNDL6NUE

https://www.youtube.com/watch?v=9qIIjv17IgQ

Tuesday, June 4, 2024

ทบทวน change owner file and folder linux command

$ sudo chown myuser myfile

$ sudo chown -R myuser myfolder

หัดใช้ Fail2ban ใน Ubuntu

  • ประเด็นคือ late limit login failed สำหรับ web site ที่เราพัฒนาเอง
  • การทำงานก็จะประมาณมี service สักตัวคอยไป monitor log ไฟล์ ถ้าเจอสิ่งผิดปกติตามเงื่อนไขที่ตั้งไว้ตาม  filter เราก็จะให้ action อะไรบ้าง ประมาณนี้
  • สิ่งที่จะคอนฟิก คือ drop package ไว้ด้วย firewall สัก 1 ชั่วโมง ถ้า login web site ล้มเหลวประมาณ 5 ครั้งในระยะเวลาช่วง 10 นาที เป็นต้น
Env
  • Fail2Ban v0.10.2

Step

  • ติดตั้ง fail2ban ด้วยคำสั่ง

$ sudo apt install fail2ban

  • เมื่อติดตั้งเรียบร้อยตรวจสอบสถานะ (มันจะทำงานเป็น service ตัว 1 ในระบบเรา)

$ sudo systemctl status fail2ban 

  • ถ้ายังไปเปิดใช้ก็ start มันซะ

$ sudo systemctl start fail2ban

  • อ้างอิงที่ Ubuntu 22.04 มันจะตั้งค่า [default] ไว้ให้แล้วซึ่ง enabled = false ซึ่ง  [jail] แต่ละอันจะใช้ค่า default ก็ได้ หรือจะกำหนดสำหรับแต่ละ  jail ก็ได้เช่นกัน
  • ที่นี้เรามาสร้าง filter กันก่อนเลย
  • ขั้นแรกสร้างไฟล์ /etc/fail2ban/jail.local เพิ่ม

$ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

  • กำหนด whitelist ip default เอาไว้ใช้กับทุก jail (ประมาณบรรทัดที่ 92)

$ sudo nano /etc/fail2ban/jail.local

  • มันถูก comment ไว้อยู่เอา  เช่น เราจะทำ whitelist ip ให้ range 192.168.1.0/24 หรือ อันเดียว 192.168.2.3 

ignoreip = 192.168.1.0/24 192.168.2.3

  • แต่เราสามารถตั้งค่า ignoreip ให้แต่ละ jail แยกกันก็ได้คือกัน โดยวาง ignoreip=xxx ไว้ภายใต้ [jail] แต่ละอัน
  • findtime อันนี้คือ ภายในกี่่นาที ที่เจอ filter เราตั้งค่าไว้ใน log (หน่วยคือ จำนวนครั้งที่นับได้จาก log file เราเงื่อนไขใน filter file ของเรา สามารถกำหนดยแยก jail  ได้เช่นกัน)
  • bantime คือ กำหนดเวลาในการ action ของเราเช่น สั่งให้ firewall block การเข้าถึง server เรากี่นาที่ นับการ monitor เจอ filter ใน log ครบตาม findtime (หน่วยถ้าไม่มีระบุต่อท้าย ค่าเริ่มต้นคือ วินาที สามารถกำหนดแยก jail ได้เช่นกัน)
  • เช่น bantime = 60 หรือ bantime = 60m , bantime = 1h 
  • เริ่มผูกการ monitor กับ web site ที่เราเขียนขึ้นมาโดย
  • เปิดไฟล์ jail.local เพิ่ม jail ของ site เรา

$ sudo nano /etc/fail2ban/jail.local

  • ตัวอย่างตั้งชื่อ jail ว่า[mysite1]
  • enabled = true ก่อนเลย
  • ให้ใช้ filter ชื่อ mysite1
  • ให้ใช้ action คือ iptable (block เลย), linenotify( อันนี้เพิ่ม  action เอง)
  • ให้เรียก monitor file ที่ /var/log/apache/mysite-access.log เช่น ถ้าพบ login failed ใน log

192.168.1.3 - - [04/Jun/2024:11:24:25 +0700] "GET /mygroup/user/loginerror HTTP/1.1" 200 581 "https://mysite.go.th/....

  • ตั้งค่า findtime = 10m คือ ภายในระยะเวลา 10 นาที ถ้า เจอ log ดังตัวอย่าง maxretry = 5 คือ 5 ครั้ง และ bantime = 60m ให้ทำการ block ip ที่พบใน log 60 นาที
  • ให้ action สั่ง iptable เพิ่ม policy block ip นั้น และ ส่ง line notify ให้ admin ด้วย
  • ที่นี้เราต้องเพิ่ม filter สำหรับ jail mysite1 เราโดย

$ sudo /etc/fail2ban/filter.d/mysite1.conf

  • เพิ่มประมาณนี้ และ บันทึกไฟล์ให้เรียบร้อย
  • สุดท้ายเพิ่ม action config file อันที่เราจะใช้ส่ง linenotify อันนี้เราต้องสร้างเอง (action iptables-multiport ใช้สำหรับ block โดย ip อันนี้เป็น action ที่มีให้แล้วแค่เรียกใช้มัน)
$ sudo /etc/fail2ban/action.d/send-line.conf
  • ตัวอย่าง send-line.conf ตอนแรกใช้ curl ส่งเลย แต่มันไม่สะดวก เลยเขียน shell script แยกแล้วเรียกใช้แทนเมื่อ ban และ unban
  • บันทึกให้เรียบร้อย และสั่ง restart service

$ sudo /etc/init.d/fail2ban restart

  • ตรวจสอบสถานะการทำกงาน

$ sudo fail2ban-client status mysite1


  • ถ้าทุกอย่างปกติ จะขั้น detail การ monitor ของ jail นั้นๆ ดังภาพตัวอย่าง

เพิ่มเติม

  • คำสั่งสำหรับดูการทำการว่ามี jail อะไรใช้งานอยู่บ้าง

$ sudo fail2ban-client status

  • ดูเป็นราย jail ด้วยคำสั่ง

$ sudo fail2ban-client status mysite1

  • ดู activity ของ service ทำงานอย่างไรบ้าง 

$ sudo fail2ban-client -d

  • สั่งให้ ban / unban โดยตรงโดย

$ sudo fail2ban-client set [jail-name] ban|unbanip [ip]

$ sudo fail2ban-client set myjail unbanip 192.168.1.2

$ sudo fail2ban-client set myjail banip 192.168.1.2 

  • ลองเปลี่ยนจาก iptable มาใช้ ufw แทนโดย เปลี่ยนค่าของแต่ะล jail ในไฟล์ jail.local
action = iptables-multiport[name=http, port="http,https", protocol=tcp, http-status=429]
action = ufw[application=Apache] # ถ้าเราไม่ใส่ [] มันจะ reject ทุก port (Apache Full ใส่แล้วไม่ทำงานซะงั้น ต้องไปสร้าง ufw app profile name เพิ่มเอานะคับ)

  • บันทึกและ restart service และ ตรวจสอบ ufw status

$ sudo systemctl restart fail2ban

$ sudo ufw status verbose 

  • เพิ่มให้อีกนิด เราจะดู app list ของ ufw โดย

$ sudo ufw app list

  • แล้วถ้าเราต้องการ custom applist ของเราเอาโดย 

$ sudo nano /etc/ufw/applications.d/apache2-utils.ufw.profile 

[MYHTTP]

title=Web Server (HTTP,HTTPS)

description=Apache v2 is the next generation of the omnipresent Apache web server.

ports=80,443/tcp

  • เราก็นำชื่อ application profile ใหม่นี้ไปกำหนด ufw ใน jail เช่น
action = ufw[application=MYHTTP] # reject port 80, 443 เป็นต้น  

  • หรือเราจะสร้าง คอนฟิกไฟล์ profile ใหม่ แล้ววางไว้ภายใต้ /etc/ufw/applications.d/myprofile แล้วเอา section ด้านบนใส่ในไฟล์แล้วบันทึก ก็จะได้ profile ใหม่มาใช้ได้เช่นกัน

Ref

  • https://bornoe.org/blog/2023/09/basic-fail2ban-commands/
  • https://zaiste.net/security/howtos/how-to-setup-fail2ban-ubuntu-18-04/
  • https://confluence.atlassian.com/adminjiraserver0820/using-fail2ban-to-limit-login-attempts-1095777624.html
  • https://araideesite.wordpress.com/2017/03/26/linenotify-part8/
  • https://manpages.debian.org/testing/fail2ban/jail.conf.5.en.html
  • https://serverfault.com/questions/285256/how-to-unban-an-ip-properly-with-fail2ban
  • https://bobcares.com/blog/fail2ban-unban-ip/
  • https://www.youtube.com/watch?v=tCHLrC93KhE
  • https://askubuntu.com/questions/409013/how-do-you-create-an-app-profile-for-ufw

Add a user and grant root privileges on Ubuntu 18.04

  • เพิ่ม user ใหม่ ด้วยคำสั่ง (user ใหม่ที่เพิ่มจะได้กลุ่มใหม่เป็นชื่อ user ด้วย)

# adduser myuser1

  • กรอกข้อมูล profile user ใหม่ หรือ ไม่กรอกก็ได้ สุดท้ายกด Y
  • เพิ่มสิทธิ์ให้ user ใหม่มีสิทธิ์เหมือน root

# visudo หรือ # nano /etc/sudoers.tmp 

  • มองหา

root ALL=(ALL:ALL)ALL

  • เพิ่มบรรทัดนี้ต่อจาก root เพื่อให้ myuser1 มีสิทธิ์เท่า root

myuser1 ALL=(ALL:ALL)ALL

  • กรณีเราจะกำหนดให้ user ที่อยู่ใน group myuser1 ให้มีสิทธิ์เท่า root กำหนดประมาณนี้

%myuser1 ALL=(ALL:ALL)ALL

เพิ่มเติม

  • อีกวิธีคือกำหนดให้ user ใหม่เข้ากลุ่ม sudo ด้วยโดย

$ sudo usermod -aG sudo myuser1

Ref

  • https://www.liquidweb.com/kb/add-user-grant-root-privileges-ubuntu-18-04/

Close root user ubuntu 22.04

  • ประเด็นคือ จะปิดการใช้ user root ใน Ubuntu 
  • เช่น login ด้วย user อื่นที่มีสิทธิ์ root แล้ว su root หรือ sudo -i จะใช้ไม่ได้นะจ้ะ

$ sudo cp /etc/passwd /etc/passwd.old

$ sudo nano /etc/passwd

  • ค้นหาบรรทัดประมาณนี้

root:x:0:0:root:/root:/bin/bash

  • แก้ไขเป็น

root:x:0:0:root:/root:/bin/nologin

เพิ่มเติม

  • คุณต้องแน่ใจว่า มีการกำหนด user อื่นที่มีสิทธิ์เท่า root แล้ว
  • เราคอนฟิกปิด root แล้วคิดว่า ไม่ต้องไปคอนฟิกปิดการ remote ด้วย root ก็น่าจะไม่มีปัญหา
  • แต่ถ้าจะมั่นใจคอนฟิกปิดการ remote ด้วย root (เข้าใจว่าค่า default มันถูกปิดอยู่แล้วนะ)
sudo nano /etc/ssh/sshd_config
  • แก้ไขบรรทัดนี้เป็น no
PermitRootLogin no

Set password complexity policy on Ubuntu 18.04++

  • ประเด็นคือจะตั้ง policy ในการกำหนดรหัสผ่านของ user ที่จะเพิ่มในระบบ  Ubuntu 18.04++
  • เช่น ต้องมีจำนวน 8 ตัวขึ้นไป และมี Upper char อย่างน้อย 1 ตัว และ Lower char และ Digit อย่างน้อย 1 ตัว และ Symbol อย่างน้อย 1 ตัว และ กำหนด อายุของรหัสผ่าน สามารถใช้ได้กี่วันแล้วต้องเปลี่ยนใหม่เป็นต้น

Step

  • ติดตั้ง lib ที่ต้องใช้งานก่อนเลย

$ sudo apt install libpam-pwquality

  • สำหรับสำรองไฟล์คอนฟิก policy ก่อนแก้ไข

$ sudo cp /etc/pam.d/common-password /etc/pam.d/common-password.old

  • จากนั้นเปิดไฟล์แก้ไข 

$ sudo nano /etc/pad.d/common-password

  • ค้นหาบรรทัดประมาณนี้

password    requisite    pam_pwquality.so    retry=3

  • แก้ไขเป็น (คอมเม้นแล้ว โดยใส่เครื่องหมาย  # ด้านหน้าสุด แล้วเพิ่มบรรทัดใหม่)
  • อันนี้ตัวอย่างตามอ้างอิง

# password    requisite    pam_pwquality.so retry=3 minlen=8 difok=3 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1 reject_username enforce_for_root

  • เราตั้ง policy เบาๆ ประมาณนี้ก็พอ

password    requisite    pam_pwquality.sol    retry=3    minlen=8    lcredit=-1    ucredit=-1 dcredit=-1    ocredit=-1   
 

  • จากนั้นบันทึกไฟล์ให้เรียบร้อย
  • เข้าใจว่า policy น่าจะมีผลกับการ เปลี่ยนรหัสใหม่ หรือ เพิ่ม user เข้ามาใหม่นะ
  • และ การกำหนดอายุของรหัสผ่านโดยแก้ไขไฟล์ /etc/login.defs (อย่าลืมสำรองไว้ด้วยกันเหนียว)

$ sudo nano /etc/login.defs

# line 165 : set password Expiration days (example below means 60 days)

PASS_MAX_DAYS 60

Ref

  • https://kifarunix.com/enforce-password-complexity-policy-on-ubuntu-18-04/
  • https://www.server-world.info/en/note?os=Ubuntu_22.04&p=pam&f=1#google_vignette

Popular Posts