Menu

Friday, January 17, 2020

[System] การตั้งค่า Crontab เพื่อรันภายใต้ผู้ใช้งานที่ระบุ
[System] How to Run Crontab with Specific User

ในบางครั้งเราต้องการรัน cron ภายใต้ผู้ใช้งานที่เราระบุ ยกตัวอย่าง เช่น การรัน schedule ของ Laravel การไม่ระบุผู้ใช้งาน อาจจะทำให้เกิดปัญหาขึ้นได้ (อ่านเพิ่มได้ที่ [Laravel - Scheduler] ระวัง!!! การไม่กำหนด username ใน Cron Entry สามารถทำให้เกิด "Permission Denied" ได้)

การระบุผู้ใช้งานที่รัน cron สามารถระบุได้ 2 แบบดังนี้
  1. การตั้งค่า cron ในไฟล์ /etc/crontab หรือไฟล์ใน /etc/cron.d/ สามารถเพิ่ม cron entry ที่มี username ได้เลย ดังนี้
  2. * * * * * username /path/to/your/script.sh
    
  3. การตั้งค่า cron ภายใต้ user ที่ต้องการ สามารถรันคำสั่งดังนี้ 
  4. sudo crontab -u username -e
    
    หลังจากนั้น เพิ่ม cron entry ดังนี้
    * * * * * /path/to/your/script.sh
    
หมายเหตุ ไม่สามารถใช้ crontab entry แบบที่ 1 เพิ่มลงในการตั้งค่า cron แบบที่ 2 เนื่องจาก /path/to/your/script.sh จะไม่ถูกรัน

Wednesday, January 15, 2020

[Security] วิธีการดูข้อมูลใน ไฟล์ PFX บน Windows
[Security] How to View Content of PFX File on Windows

ไฟล์ PFX เป็นไฟล์ที่ใช้เก็บ certificates ทั้งหมดรวมถึง private key ที่เกี่ยวข้องด้วย ซึ่งไฟล์นี้จะมีการป้องกันด้วยรหัสผ่าน ในกรณีนี้เราใช้ไฟล์นี้ในการทำ Digital Signature

สำหรับวิธีดูข้อมูลในไฟล์ PFX สามารถรันคำสั่งใดคำสั่งหนึ่งข้างล่างนี้

  1. รันคำสั่งนี้ใน command prompt
  2. certutil -dump <path_to_cert>
    

  3. รันคำสั่งนี้ใน Windows PowerShell
  4. Get-PfxCertificate -FilePath <path_to_cert>
    

Monday, January 6, 2020

[Security] วิธีการบีบอัดไฟล์ ZIP พร้อมเข้ารหัสและถอดรหัสด้วย Public และ Private Keys
[Security] How to Create ZIP Files with Encryption and Decryption using Public and Private Key


สมมติว่า
  1. เราสร้าง Private key ชื่อ key.pem และ Public key ชื่อ pub.pem ด้วย OpenSSL แล้ว
  2. เราต้องการสร้าง ไฟล์ ZIP ชื่อ archive.7z 

วิธีการบีบอัดและเข้ารหัสไฟล์ ZIP

  1. สร้างรหัสผ่านด้วยการสุ่ม
  2. เข้ารหัสรหัสผ่านด้วย pub.pem แล้วบันทึกลงไฟล์ข้อความ archivePassword.ssl
  3. บีบอัดไฟล์ข้อความดังกล่าว archivePassword.ssl เข้าไปใน archive.7z โดยไม่กำหนดรหัสผ่าน
  4. บีบอัดแฟ้มหรือไฟล์ที่ต้องการเข้าไปเพิ่มใน archive.7z ด้วยรหัสผ่านตามข้อ 1

วิธีการถอดรหัสและแตกไฟล์ไฟล์ ZIP

  1. แตกไฟล์ข้อความ archivePassword.ssl จาก archive.7z
  2. ถอดรหัสข้อความภายใน archivePassword.ssl  ด้วย key.pem เพื่อให้ได้รหัสผ่านสำหรับแตกไฟล์
  3. แตก archive.7z ส่วนที่เหลือด้วยรหัสผ่านที่จากข้อ 2 เพื่อให้ได้แฟ้มหรือไฟล์ที่ต้องการ
สำหรับคนที่ต้องการใช้งานสคริปต์สำเร็จรูป สามารถดูได้ที่ https://github.com/arzeroid/e7z

หมายเหตุ สาเหตุที่ไม่เข้ารหัสไฟล์ ZIP ทั้งไฟล์ เพราะจะใช้เวลานานทั้งตอนเข้ารหัสและถอดรหัส จึงเข้ารหัสและถอดรหัสแค่รหัสผ่านเท่านั้น

[Laravel - Scheduler] ระวัง!!! การไม่กำหนด username ใน Cron Entry สามารถทำให้เกิด "Permission Denied" ได้
[Laravel - Scheduler] Warning!!! Adding Cron Entry without Specify Username May Cause "Permission Denied"

จากตัวอย่างใน Starting The Scheduler จะกำหนดให้ใส่ cron entry ดังนี้
 
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
ถ้าหากเราตั้งค่าข้างต้นใน crontab ของ root จะมีผลทำให้ folder ที่ถูกสร้างโดย Laravel command ที่ถูกรัน เป็นสิทธิ์ root ทันที

ผลกระทบ คือ เมื่อ controller พยายามเขียนไฟล์หรือสร้าง folder ภายใน folder ดังกล่าว จะเกิด Permission Denied ขึ้น ซึ่งอาจจะทำให้หน้าเว็บไม่สามารถใช้งานได้เลย

วิธีการป้องกัน คือ ให้ใส่ cron entry โดยกำหนด username ที่รันเป็น user ที่ใช้รัน web server ดังนี้
 
* * * * * username cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
โดยปกติแล้ว username ที่รัน PHPFPM จะเป็น www-data ดังนั้น cron entry จะเป็นดังนี้
 
* * * * * www-data cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

หมายเหตุ กรณีที่สร้าง folder ด้วยสิทธิ์ root ไปแล้ว ให้แก้ไขโดยใช้คำสั่งดังนี้
 
chown username folder_name
เช่น
 
chown www-data storages