หลังจากที่ npm มีปัญหาเรื่อง supply-chain attack, malware, phishing, spam, และ incident ต่าง ๆ ดังนั้นนักพัฒนาและผู้ดูแลแพ็กเกจจึงควรมีแนวทางป้องกันความปลอดภัยที่ดี ดังนี้ครับ
.
สำหรับนักพัฒนา (Developers)
1. Pin Dependency Versions
– ตรึงเวอร์ชัน dependency ให้แน่นอน หลีกเลี่ยงการใช้ ^ หรือ ~
– ใช้ –save-exact (เพื่อ pin เวอร์ชันไปเลย) เช่น
npm install –save-exact react
pnpm add –save-exact react
yarn add –save-exact react
ป.ล. –save-exact สามารถตั้งเป็น global ได้
– ใช้ overrides (npm, pnpm) หรือ resolutions (yarn) เพื่อควบคุม transitive dependencies ให้ตรงตามเวอร์ชันที่ปลอดภัย
.
2. Include Lockfiles (ใช้และ commit lockfile)
– ถ้าไม่ใช้ lockfile เวลา install dependency บนเครื่องต่าง ๆ (dev, staging, production) อาจได้เวอร์ชัน ไม่เหมือนกัน เพราะ dependency อาจอัปเดต minor/patch เอง
– commit lockfile (package-lock.json, pnpm-lock.yaml, bun.lock, yarn.lock, deno.lock) ลง Git เสมอ
– ใช้คำสั่งติดตั้งที่อ้างอิง lockfile โดยตรง เช่น
npm ci
bun install –frozen-lockfile
yarn install –frozen-lockfile
deno install –frozen
.
3. Disable Lifecycle Scripts (ปิดการทำงานของ lifecycle scripts)
– ปิดการทำงานของ preinstall, postinstall ที่มักถูกใช้เป็นช่องโหว่โจมตี เช่น worm อย่าง Shai-Hulud ที่แอบแก้ package.json เพื่อใส่ postinstall ขโมย credentials
คำสั่ง:
npm config set ignore-scripts true –global
yarn config set enableScripts false
(bun, pnpm, deno ปิดไว้เป็นค่าเริ่มต้นอยู่แล้ว)
.
4. Set Minimal Release Age
– ป้องกันการติดตั้ง package ที่เพิ่งถูกปล่อยไม่นาน (เสี่ยง malware)
เช่น pnpm config set minimumReleaseAge 1440 (1 วัน)
npm install –before=”$(date -v -1d)”
.
5. ใช้ Permission Model
Node.js, Deno มีระบบจำกัดสิทธิ์ เช่นไฟล์, network
ตัวอย่าง:
node –permission index.js
deno run –allow-read script.ts
.
6. ลดการใช้ External Dependencies
– ใช้ฟีเจอร์ built-in ของ Node.js, Deno, Bun แทน lib เล็ก ๆ
เช่น
ใช้ fetch แทน axios
ใช้ node:test แทน jest
ใช้ –env-file แทน dotenv
.
สำหรับผู้ดูแลแพ็กเกจ (Maintainers)
7. Enable 2FA
– เปิด Two-Factor Authentication บัญชี NPM
– ใช้ Security Key (WebAuthn) จะปลอดภัยกว่า OTP
.
8. Create Tokens ด้วย Limited Access
– ใช้ Granular Access Tokens แทน Legacy Token
– จำกัด scope, package, IP, และตั้งวันหมดอายุ
.
9. Generate Provenance Statements
– เปิด provenance เพื่อตรวจสอบว่ามีการ build มาจาก source ที่โปร่งใส
– ใช้ npm publish –provenance หรือกำหนดใน .npmrc
– แนะนำใช้ Trusted Publishing (OIDC) แทน token
.
10. Review Published Files
– จำกัดไฟล์ที่ publish โดยใช้ “files”: […] หรือ .npmignore
– ตรวจสอบด้วย npm pack –dry-run
.
หมวดอื่น ๆ (Miscellaneous)
11. NPM Organization
– เปิดบังคับใช้ 2FA ระดับองค์กร
– ลดจำนวนสมาชิกที่รับผิดชอบ
– แยกทีมเพื่อจัดการ permission แต่ละ package
.
12. Use Private Registry
– ใช้ private registry เช่น GitHub Packages, Verdaccio, Artifactory
– ควบคุมนโยบาย package ภายในองค์กร
.
13. Audit, Monitor และ Security Tools
– ตรวจสอบ dependency ด้วย audit tool เช่น
npm audit, npm audit fix
pnpm audit
bun audit
yarn npm audit
.
14. Support OSS
– สนับสนุนโครงการ Open Source ที่ใช้งาน เพื่อ ecosystem แข็งแรงขึ้น