[
  {
    "id": "TWGCB-01-014-0001",
    "category": "磁碟與檔案系統",
    "name": "cramfs檔案系統",
    "description": "這項原則設定決定是否支援cramfs檔案系統\ncramfs (compressed ROM file system，壓縮唯讀閃存檔案系統)使用zlib壓縮資料，不需要將資料載入到記憶體中，因此可節省大量記憶體空間，並且可直接使用cramfs映像檔案而無需先進行解壓縮，故特別適用於某些老舊系統或對記憶體有嚴格限制之環境\n停止支援cramfs檔案系統，以減少系統被攻擊面",
    "method": "開啟終端機，執行vim指令，在/etc/modprobe.d目錄新增或編輯「cramfs.conf」檔案，範例如下：\n#vim /etc/modprobe.d/cramfs.conf\n並在檔案中加入以下內容：\ninstall cramfs /bin/false\nblacklist cramfs\n開啟終端機，執行下列指令，移除cramfs模組：\n#modprobe -r cramfs",
    "expected": "停用",
    "check_cmd": "modprobe -n -v cramfs 2>&1 | grep -q '/bin/false' && echo PASS || echo FAIL",
    "remediation": "sudo bash -c 'echo \"install cramfs /bin/false\" > /etc/modprobe.d/cramfs.conf && echo \"blacklist cramfs\" >> /etc/modprobe.d/cramfs.conf' && sudo modprobe -r cramfs 2>/dev/null"
  },
  {
    "id": "TWGCB-01-014-0002",
    "category": "磁碟與檔案系統",
    "name": "squashfs檔案系統",
    "description": "這項原則設定決定是否支援squashfs檔案系統\nsquashfs是一個即時解壓縮之檔案系統，專門為壓縮唯讀檔案系統而設計，常見於各Linux發行版之Live CD\n停止支援squashfs檔案系統，以減少系統被攻擊面\n\t停止支援squashfs檔案系統，將可能導致Snap套件無法正常運作",
    "method": "開啟終端機，執行vim指令，在/etc/modprobe.d目錄，新增或編輯「squashfs.conf」檔案，範例如下：\n#vim /etc/modprobe.d/squashfs.conf\n並在檔案中加入以下內容：\ninstall squashfs /bin/false\nblacklist squashfs\n開啟終端機，執行下列指令，移除squashfs模組：\n#modprobe -r squashfs",
    "expected": "停用",
    "check_cmd": "modprobe -n -v squashfs 2>&1 | grep -q '/bin/false' && echo PASS || echo FAIL",
    "remediation": "sudo bash -c 'echo \"install squashfs /bin/false\" > /etc/modprobe.d/squashfs.conf && echo \"blacklist squashfs\" >> /etc/modprobe.d/squashfs.conf'"
  },
  {
    "id": "TWGCB-01-014-0003",
    "category": "磁碟與檔案系統",
    "name": "udf檔案系統",
    "description": "這項原則設定決定是否支援udf檔案系統\nudf(Universal disk format，通用磁碟格式)是根據ISO/IEC 13346與ECMA-167標準所實作之檔案系統，由光學儲存技術協會(OSTA)開發與維護，廣泛應用在如CD-R/RW與DVD-R/RW等可寫光學儲存媒體\n停止支援udf檔案系統，以減少系統被攻擊面\nudf檔案系統若運行在Microsoft Azure上，將可能影響系統正常運作",
    "method": "開啟終端機，執行vim指令，在/etc/modprobe.d目錄，新增或編輯「udf.conf」檔案，範例如下：\n#vim /etc/modprobe.d/udf.conf\n並在檔案中加入以下內容：\ninstall udf /bin/false\nblacklist udf\n開啟終端機，執行下列指令，移除udf模組：\n#modprobe -r udf",
    "expected": "停用",
    "check_cmd": "modprobe -n -v udf 2>&1 | grep -q '/bin/false' && echo PASS || echo FAIL",
    "remediation": "sudo bash -c 'echo \"install udf /bin/false\" > /etc/modprobe.d/udf.conf && echo \"blacklist udf\" >> /etc/modprobe.d/udf.conf'"
  },
  {
    "id": "TWGCB-01-014-0004",
    "category": "磁碟與檔案系統",
    "name": "設定/tmp目錄之檔案系統",
    "description": "這項原則設定決定/tmp目錄是否使用tmpfs檔案系統\n/tmp是具有全域寫入權限之目錄，所有使用者與某些應用程式可將其用於暫存檔案\ntmpfs是一個不存在於實體硬碟上，而是駐存在記憶體的特殊檔案系統，可提供優於傳統機械硬碟之存取速度\n將/tmp目錄掛載到tmpfs，可於掛載選項上使用noexec選項，指定/tmp目錄不能啟動可執行二進制檔案，降低惡意程式感染風險",
    "method": "執行以下任一操作以設定/tmp目錄之檔案系統：\n開啟終端機，執行下列指令，編輯/etc/fstab\n#vim /etc/fstab\n/tmp之掛載設定範例如下：\ntmpfs /tmp tmpfs defaults,rw,nosuid,nodev,noexec,relatime 0 0\n開啟終端機，執行下列指令，運用systemd掛載/tmp：\n#systemctl unmask tmp.mount\n#systemctl enable tmp.mount\n編輯/etc/systemd/system/local-fs.target.wants/tmp.mount以掛載/tmp：\n[Mount]\nWhat=tmpfs\nWhere=/tmp\nType=tmpfs\nOptions=mode=1777,strictatime,noexec,nodev,nosuid",
    "expected": "tmpfs",
    "check_cmd": "findmnt -n /tmp | grep -q tmpfs && echo PASS || echo FAIL",
    "remediation": "編輯 /etc/fstab 加入: tmpfs /tmp tmpfs defaults,rw,nosuid,nodev,noexec,relatime 0 0\n然後執行: sudo systemctl enable tmp.mount && sudo mount -a"
  },
  {
    "id": "TWGCB-01-014-0005",
    "category": "磁碟與檔案系統",
    "name": "設定/tmp目錄之nodev選項",
    "description": "這項原則設定決定/tmp目錄是否啟用nodev選項，以禁止在/tmp目錄中建立裝置檔案\n由於/tmp目錄用途不在於支援裝置檔案，啟用nodev選項以確保使用者無法在/tmp目錄中建立裝置檔案或存取隨機硬體裝置，降低惡意程式感染風險\n可設定之參數如下：\ndev：允許建立裝置檔案\nnodev：禁止建立裝置檔案",
    "method": "執行以下任一操作以設定/tmp目錄之nodev選項：\n編輯/etc/fstab檔案，在掛載點為/tmp列，於第4欄加入「,nodev」\n開啟終端機，執行下列指令，重新掛載/tmp：\n#mount -o remount,nodev /tmp\n編輯/etc/systemd/system/local-fs.target.wants/tmp.mount，將nodev添加到/tmp掛載選項：\n[Mount]\nOptions=mode=1777,strictatime,noexec,nodev,nosuid\n開啟終端機，執行下列指令，重新掛載/tmp：\n#mount -o remount,nodev /tmp",
    "expected": "啟用",
    "check_cmd": "findmnt -n /tmp | grep -q nodev && echo PASS || echo FAIL",
    "remediation": "編輯 /etc/fstab，在 /tmp 掛載點的第 4 欄加入 nodev\n執行: sudo mount -o remount,nodev /tmp"
  },
  {
    "id": "TWGCB-01-014-0006",
    "category": "磁碟與檔案系統",
    "name": "設定/tmp目錄之nosuid選項",
    "description": "這項原則設定決定/tmp目錄是否啟用nosuid選項，以禁止/tmp目錄存在具有SUID屬性的檔案\nSUID(Set User ID)是一種針對可執行二進制檔案(Binary file)所設計之功能，當任何使用者執行該程式時，會以該程式擁有者的身分執行，藉由短暫提權讓一般使用者存取未被授權之檔案\n可設定之參數如下：\nsuid：允許存在具有SUID屬性之檔案\nnosuid：禁止存在具有SUID屬性之檔案",
    "method": "執行以下任一操作以設定/tmp目錄之nosuid選項：\n編輯/etc/fstab檔案，在掛載點為/tmp列，於第4欄加入「,nosuid」\n開啟終端機，執行下列指令，重新掛載/tmp：\n#mount -o remount,nosuid /tmp\n編輯/etc/systemd/system/local-fs.target.wants/tmp.mount，將nosuid添加到/tmp掛載選項：\n[Mount]\nOptions=mode=1777,strictatime,noexec,nodev,nosuid\n開啟終端機，執行下列指令，重新掛載/tmp：\n#mount -o remount,nosuid /tmp",
    "expected": "啟用",
    "check_cmd": "findmnt -n /tmp | grep -q nosuid && echo PASS || echo FAIL",
    "remediation": "編輯 /etc/fstab，在 /tmp 掛載點的第 4 欄加入 nosuid\n執行: sudo mount -o remount,nosuid /tmp"
  },
  {
    "id": "TWGCB-01-014-0007",
    "category": "磁碟與檔案系統",
    "name": "設定/tmp目錄之noexec選項",
    "description": "這項原則設定決定/tmp目錄是否啟用noexec選項，以禁止在/tmp目錄中啟動可執行的二進制檔案\n/tmp目錄主要用於暫時存放檔案，禁止使用者啟動可執行的二進制檔案，降低惡意程式感染風險\n可設定之參數如下：\nexec：允許啟動可執行二進制檔案\nnoexec：禁止啟動可執行二進制檔案",
    "method": "執行以下任一操作以設定/tmp目錄之noexec選項：\n編輯/etc/fstab檔案，在掛載點為/tmp列，於第4欄加入「,noexec」\n開啟終端機，執行下列指令，重新掛載/tmp：\n#mount -o remount,noexec /tmp\n編輯/etc/systemd/system/local-fs.target.wants/tmp.mount將noexec添加到/tmp掛載選項：\n[Mount]\nOptions=mode=1777,strictatime,noexec,nodev,nosuid\n開啟終端機，執行下列指令，重新掛載/tmp：\n#mount -o remount,noexec /tmp",
    "expected": "啟用",
    "check_cmd": "findmnt -n /tmp | grep -q noexec && echo PASS || echo FAIL",
    "remediation": "編輯 /etc/fstab，在 /tmp 掛載點的第 4 欄加入 noexec\n執行: sudo mount -o remount,noexec /tmp"
  },
  {
    "id": "TWGCB-01-014-0008",
    "category": "磁碟與檔案系統",
    "name": "設定/dev/shm目錄之nodev選項",
    "description": "這項原則設定決定/dev/shm目錄是否啟用nodev選項，以禁止在/dev/shm目錄中建立裝置檔案\n/dev/shm目錄是系統利用記憶體所建立之虛擬磁碟空間，用以存放暫存檔案，一方面存取速度比硬碟快，另一方面可依實際檔案大小動態分配空間\n由於/dev/shm目錄用途不在於支援裝置，設定nodev選項以確保使用者無法在/dev/shm目錄建立裝置檔案或存取隨機硬體裝置，降低惡意程式感染風險\n可設定之參數如下：\ndev：允許建立裝置檔案\nnodev：禁止建立裝置檔案",
    "method": "編輯/etc/fstab檔案，在掛載點為/dev/shm列，於第4欄加入「,nodev」\n若掛載點不存在，請於/etc/fstab檔案新增掛載點，並於第4欄加入「,nodev」，範例如下：\ntmpfs /dev/shm tmpfs rw,nosuid,nodev,inode64 0 0\n開啟終端機，執行下列指令，重新掛載/dev/shm：\n#mount -o remount,nodev /dev/shm",
    "expected": "啟用",
    "check_cmd": "findmnt -n /dev/shm | grep -q nodev && echo PASS || echo FAIL",
    "remediation": "編輯 /etc/fstab 加入: tmpfs /dev/shm tmpfs defaults,rw,nosuid,nodev,noexec 0 0\n執行: sudo mount -o remount,nodev /dev/shm"
  },
  {
    "id": "TWGCB-01-014-0009",
    "category": "磁碟與檔案系統",
    "name": "設定/dev/shm目錄之nosuid選項",
    "description": "這項原則設定決定/dev/shm目錄是否啟用nosuid選項，以禁止/dev/shm目錄存在具有SUID屬性之檔案\n/dev/shm目錄是利用記憶體所建立之虛擬磁碟空間，用以存放暫存檔案，其存取速度比硬碟快，且可依實際檔案大小動態分配空間\nSUID(Set User ID)是針對可執行二進制檔案(Binary file)所設計之功能，任何使用者執行該程式時，會以該程式擁有者之身分執行，藉由短暫提權讓一般使用者存取未被授權之檔案\n可設定之參數如下：\nsuid：允許存在具有SUID屬性之檔案\nnosuid：禁止存在具有SUID屬性之檔案",
    "method": "編輯/etc/fstab檔案，在掛載點為/dev/shm列，於第4欄加入「,nosuid」\n若掛載點不存在，請於/etc/fstab檔案新增掛載點，並於第4欄加入「,nosuid」，範例如下：\ntmpfs /dev/shm tmpfs rw, nosuid,nodev,inode64 0 0\n開啟終端機，執行下列指令，重新掛載/dev/shm：\n#mount -o remount,nosuid /dev/shm",
    "expected": "啟用",
    "check_cmd": "findmnt -n /dev/shm | grep -q nosuid && echo PASS || echo FAIL",
    "remediation": "執行: sudo mount -o remount,nosuid /dev/shm"
  },
  {
    "id": "TWGCB-01-014-0010",
    "category": "磁碟與檔案系統",
    "name": "設定/dev/shm目錄之noexec選項",
    "description": "這項原則設定決定/dev/shm目錄是否啟用noexec選項，以禁止在/dev/shm目錄中啟動可執行二進制檔案\n/dev/shm目錄是系統利用記憶體所建立之虛擬磁碟空間，用以存放暫存檔案，一方面存取速度比硬碟快，另一方面可依實際檔案大小動態分配空間\n設定noexec選項，禁止使用者啟動可執行二進制檔案，降低惡意程式感染風險\n可設定之參數如下：\nexec：允許啟動可執行二進制檔案\nnoexec：禁止啟動可執行二進制檔案",
    "method": "編輯/etc/fstab檔案，在掛載點為/dev/shm列，於第4欄加入「,noexec」\n若掛載點不存在，請於/etc/fstab檔案新增掛載點，並於第4欄加入「,noexec」，範例如下：\ntmpfs /dev/shm tmpfs rw, nosuid,nodev,noexec,inode64 0 0\n開啟終端機，執行下列指令，重新掛載/dev/shm：\n#mount -o remount,noexec /dev/shm",
    "expected": "啟用",
    "check_cmd": "findmnt -n /dev/shm | grep -q noexec && echo PASS || echo FAIL",
    "remediation": "執行: sudo mount -o remount,noexec /dev/shm"
  },
  {
    "id": "TWGCB-01-014-0011",
    "category": "磁碟與檔案系統",
    "name": "設定/var目錄之檔案系統",
    "description": "這項原則設定決定是否為/var目錄建立獨立之分割磁區或邏輯磁區\n/var目錄主要供守護程序(daemon)與其他系統服務用來儲存經常性變動資料\n/var目錄有時會包含其他軟體套件所建立之全域寫入目錄，若未設為獨立之分割磁區或邏輯磁區，將可能造成系統儲存空間耗盡\n由於apt套件管理工具或其他程式可能暫存較大之檔案於/var目錄中，可依實務需求設定適當磁區容量\n請定期進行/var目錄之資料夾同步與備份，以確保系統穩定性與資料完整性，並避免因磁碟空間不足導致服務中斷",
    "method": "對於新安裝之系統，在系統安裝過程中建立自定義磁區，為/var指定一個獨立磁區\n對於已安裝之系統，建議先完成全系統備份後始進行磁區分割作業。使用邏輯磁區管理員(Logical volume manager, LVM)建立獨立的/var磁區之範例如下：\n情境說明：系統擁有1顆20GB的SCSI硬碟，目前已建立2個主要磁區，合計已使用5GB空間。針對剩餘硬碟空間使用LVM建立1個256MB的/var邏輯磁區操作順序如下：\n#gdisk /dev/sda\n#n(新增磁區)\n#3(建立磁區編號)\n#enter(在First sector輸入)\n#+256M(在Last sector輸入)\n#8e00(變更Hex code，LVM磁區代碼)\n#w(寫入磁區分割表格)\n#partprobe(強制重新抓磁區分割表格)\n#pvcreate /dev/sda3(對/dev/sda3建立PV)\n#vgcreate -s 16M varvg /dev/sda3(對/dev/sda3建立1個VG，VG名稱varvg，且指定1個PE大小16MB)\n#vgdisplay(顯示目前系統VG狀態，本範例的Total PE數顯示為15)\n#lvcreate -l 15 -n varlv varvg (從varvg分割出1個LV，LV名稱varlv，並將15個PE配置給varlv)\n#mkfs.xfs /dev/varvg/varlv(對/dev/varvg/varlv進行格式化)\n接著，編輯/etc/fstab檔案，新增或修改成以下內容： \n/dev/varvg/varlv /var xfs defaults  0  0",
    "expected": "使用獨立之分割磁區或邏輯磁區",
    "check_cmd": "modprobe -n -v usb-storage 2>&1 | grep -q '/bin/false' && echo PASS || echo FAIL",
    "remediation": "sudo bash -c 'echo \"install usb-storage /bin/false\" > /etc/modprobe.d/usb-storage.conf && echo \"blacklist usb-storage\" >> /etc/modprobe.d/usb-storage.conf' && sudo modprobe -r usb-storage 2>/dev/null"
  },
  {
    "id": "TWGCB-01-014-0012",
    "category": "磁碟與檔案系統",
    "name": "設定/var目錄之nodev選項",
    "description": "這項原則設定決定/var目錄是否啟用nodev選項，以禁止在/var目錄中建立裝置檔案\n由於/var目錄用途不在於支援裝置，設定nodev選項以確保使用者無法在/var目錄建立裝置檔案或存取隨機硬體裝置，降低惡意程式感染風險\n可設定之參數如下：\ndev：允許建立裝置檔案\nnodev：禁止建立裝置檔案",
    "method": "編輯/etc/fstab檔案，在掛載點為/var列，於第4欄加入「,nodev」\n開啟終端機，執行下列指令，重新掛載/var：\n#mount -o remount,nodev /var",
    "expected": "啟用",
    "check_cmd": "dpkg -s aide 2>/dev/null | grep -q 'install ok' && echo PASS || echo FAIL",
    "remediation": "sudo apt install aide aide-common -y && sudo aideinit && sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db"
  },
  {
    "id": "TWGCB-01-014-0013",
    "category": "磁碟與檔案系統",
    "name": "設定/var目錄之nosuid選項",
    "description": "這項原則設定決定/var目錄是否啟用nosuid選項，以禁止/var目錄存在具有SUID屬性之檔案\nSUID(Set User ID)是針對可執行二進制檔案(Binary file)所設計之功能，任何使用者執行該程式時，會以該程式擁有者之身分執行，藉由短暫提權讓一般使用者存取未被授權之檔案\n可設定之參數如下：\nsuid：允許存在具有SUID屬性之檔案\nnosuid：禁止存在具有SUID屬性之檔案",
    "method": "編輯/etc/fstab檔案，在掛載點為/var列，於第4欄加入「,nosuid」\n開啟終端機，執行下列指令，重新掛載/var：\n#mount -o remount,nosuid /var",
    "expected": "啟用",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 13 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0014",
    "category": "磁碟與檔案系統",
    "name": "設定/var/tmp目錄之檔案系統",
    "description": "這項原則設定決定是否為/var/tmp目錄建立獨立之分割磁區或邏輯磁區\n/var/tmp是具有全域寫入權限之目錄，所有使用者與某些應用程式都將其用於暫存檔案，若未設為獨立之分割磁區或邏輯磁區，將可能造成系統儲存空間耗盡\n將/var/tmp目錄掛載到獨立之分割磁區或邏輯磁區，可於掛載選項上使用noexec選項，指定/var/tmp目錄不能啟動可執行二進制檔案，使攻擊者不能安裝或執行惡意程式",
    "method": "對於新安裝的系統，在系統安裝過程中建立自定義磁區，為/var/tmp指定一個獨立磁區\n對於已安裝的系統，請先完成全系統備份後始進行磁區分割作業，使用邏輯磁區管理員建立獨立的/var/tmp磁區之範例如下：\n 情境說明：系統擁有1顆20GB的SCSI硬碟，目前已建立2個主要磁區，合計已使用5GB空間。針對剩餘硬碟空間使用LVM建立1個256MB的/var/tmp邏輯磁區操作順序如下：\n#gdisk /dev/sda\n#n(新增磁區)\n#3(建立磁區編號)\n#enter(在First sector輸入)\n#+256M(在Last sector輸入)\n#8e00(變更Hex code，LVM磁區代碼)\n#w(寫入磁區分割表格)\n#partprobe(強制重新抓磁區分割表格)\n#pvcreate /dev/sda3(對/dev/sda3建立PV)\n#vgcreate -s 16M vartmpvg /dev/sda3(對/dev/sda3建立1個VG，VG名稱vartmpvg，且指定1個PE大小16MB)\n#vgdisplay(顯示目前系統VG狀態，本範例的Total PE數顯示為15)\n#lvcreate -l 15 -n vartmplv vartmpvg (從vartmpvg分割出1個LV，LV名稱vartmplv，並將15個PE配置給vartmplv)\n#mkfs.xfs /dev/vartmpvg/vartmplv(對/dev/vartmpvg/vartmplv進行格式化)\n接著，編輯/etc/fstab檔案，新增或修改成以下內容：\n/dev/vartmpvg/vartmplv /var/tmp xfs defaults 0 0",
    "expected": "使用獨立之分割磁區或邏輯磁區",
    "check_cmd": "stat -c '%a' /boot/grub/grub.cfg 2>/dev/null | grep -q '600' && echo PASS || echo FAIL",
    "remediation": "sudo chmod 600 /boot/grub/grub.cfg"
  },
  {
    "id": "TWGCB-01-014-0015",
    "category": "磁碟與檔案系統",
    "name": "設定/var/tmp目錄之nodev選項",
    "description": "這項原則設定決定/var/tmp目錄是否啟用nodev選項，以禁止在/var/tmp目錄中建立裝置檔案\n由於/var/tmp目錄用途不在於支援裝置，設定nodev選項以確保使用者無法在/var/tmp目錄建立裝置檔案或存取隨機硬體裝置，降低惡意程式感染風險\n可設定之參數如下：\ndev：允許建立裝置檔案\nnodev：禁止建立裝置檔案",
    "method": "編輯/etc/fstab檔案，在掛載點為/var/tmp列，於第4欄加入「,nodev」\n開啟終端機，執行下列指令，重新掛載/var/tmp：\n#mount -o remount,nodev /var/tmp",
    "expected": "啟用",
    "check_cmd": "findmnt -n /var/tmp | grep -q '/var/tmp' && echo PASS || echo FAIL",
    "remediation": "為 /var/tmp 建立獨立掛載點"
  },
  {
    "id": "TWGCB-01-014-0016",
    "category": "磁碟與檔案系統",
    "name": "設定/var/tmp目錄之nosuid選項",
    "description": "這項原則設定決定/var/tmp目錄是否啟用nosuid選項，以禁止/var/tmp目錄存在具有SUID屬性之檔案\nSUID(Set User ID)是針對可執行二進制檔案(Binary file)所設計之功能，任何使用者執行該程式時，會以該程式擁有者之身分執行，藉由短暫提權讓一般使用者存取未被授權之檔案\n可設定之參數如下：\nsuid：允許存在具有SUID屬性之檔案\nnosuid：禁止存在具有SUID屬性之檔案",
    "method": "編輯/etc/fstab檔案，在掛載點為/var/tmp列，於第4欄加入「, nosuid」\n開啟終端機，執行下列指令，重新掛載/var/tmp：\n#mount -o remount,nosuid /var/tmp",
    "expected": "啟用",
    "check_cmd": "grep -q 'hard core 0' /etc/security/limits.conf 2>/dev/null && echo PASS || echo FAIL",
    "remediation": "sudo bash -c 'echo \"* hard core 0\" >> /etc/security/limits.conf'\nsudo bash -c 'echo \"fs.suid_dumpable = 0\" >> /etc/sysctl.d/99-security.conf' && sudo sysctl -p"
  },
  {
    "id": "TWGCB-01-014-0017",
    "category": "磁碟與檔案系統",
    "name": "設定/var/tmp目錄之noexec選項",
    "description": "這項原則設定決定/var/tmp目錄是否啟用noexec選項，以禁止在/var/tmp目錄中啟動可執行二進制檔案\n/var/tmp目錄主要做為暫時存放檔案之用，禁止使用者啟動可執行二進制檔案，降低惡意程式感染風險\n可設定之參數如下：\nexec：允許啟動可執行二進制檔案\nnoexec：禁止啟動可執行二進制檔案",
    "method": "編輯/etc/fstab檔案，在掛載點為/var/tmp列，於第4欄加入「,noexec」\n開啟終端機，執行下列指令，重新掛載/var/tmp：\n#mount -o remount,noexec /var/tmp",
    "expected": "啟用",
    "check_cmd": "sysctl kernel.randomize_va_space 2>/dev/null | grep -q '= 2' && echo PASS || echo FAIL",
    "remediation": "sudo bash -c 'echo \"kernel.randomize_va_space = 2\" >> /etc/sysctl.d/99-security.conf' && sudo sysctl -w kernel.randomize_va_space=2"
  },
  {
    "id": "TWGCB-01-014-0018",
    "category": "磁碟與檔案系統",
    "name": "設定/var/log目錄之檔案系統",
    "description": "這項原則設定決定是否為/var/log目錄建立獨立之分割磁區或邏輯磁區\n/var/log目錄用來存放系統日誌(System log)，可依實務需求設定適當磁區容量，以確保所有系統日誌皆可順利儲存\n由於系統日誌檔容量可能會過於巨大，為/var/log目錄建立獨立之分割磁區或邏輯磁區，可避免系統儲存空間耗盡，同時可保護稽核紀錄",
    "method": "對於新安裝的系統，在系統安裝過程中建立自定義磁區，為/var/log指定一個獨立磁區\n對於已安裝的系統，請先完成全系統備份後始進行磁區分割作業，使用邏輯磁區管理員建立獨立的/var/log磁區之範例如下：\n情境說明：系統擁有1顆20GB的SCSI硬碟，目前已建立2個主要磁區，合計已使用5GB空間。針對剩餘硬碟空間使用LVM建立1個256MB的/var/log邏輯磁區操作順序如下：\n#gdisk /dev/sda\n#n(新增磁區)\n#3(建立磁區編號)\n#enter(在First sector輸入)\n#+256M(在Last sector輸入)\n#8e00(變更Hex code，LVM磁區代碼)\n#w(寫入磁區分割表格)\n#partprobe(強制重新抓磁區分割表格)\n#pvcreate /dev/sda3(對/dev/sda3建立PV)\n#vgcreate -s 16M varlogvg /dev/sda3(對/dev/sda3建立1個VG，VG名稱varlogvg，且指定1個PE大小16MB)\n#vgdisplay(顯示目前系統VG狀態，本範例的Total PE數顯示為15)\n#lvcreate -l 15 -n varloglv varlogvg (從varlogvg分割出1個LV，LV名稱varloglv，並將15個PE配置給varloglv)\n#mkfs.xfs /dev/varlogvg/varloglv(對/dev/varlogvg/varloglv進行格式化)\n接著，編輯/etc/fstab檔案，新增或修改成以下內容：\n/dev/varlogvg/varloglv /var/log xfs defaults  0  0",
    "expected": "使用獨立之分割磁區或邏輯磁區",
    "check_cmd": "dpkg -s prelink 2>&1 | grep -q 'not installed' && echo PASS || echo FAIL",
    "remediation": "sudo apt purge prelink -y"
  },
  {
    "id": "TWGCB-01-014-0019",
    "category": "磁碟與檔案系統",
    "name": "設定/var/log目錄之nodev選項",
    "description": "這項原則設定決定/var/log目錄是否啟用nodev選項，以禁止在/var/log目錄中建立裝置檔案\n由於/var/log目錄用途不在於支援裝置，設定nodev選項以確保使用者無法在/var/log目錄建立裝置檔案或存取隨機硬體裝置，降低惡意程式感染風險\n可設定之參數如下：\ndev：允許建立裝置檔案\nnodev：禁止建立裝置檔案",
    "method": "編輯/etc/fstab檔案，在掛載點為/var/log列，於第4欄加入「,nodev」\n開啟終端機，執行下列指令，重新掛載/var/log：\n#mount -o remount,nodev /var/log",
    "expected": "啟用",
    "check_cmd": "findmnt -n /var/log | grep -q '/var/log' && echo PASS || echo FAIL",
    "remediation": "為 /var/log 建立獨立掛載點"
  },
  {
    "id": "TWGCB-01-014-0020",
    "category": "磁碟與檔案系統",
    "name": "設定/var/log目錄之nosuid選項",
    "description": "這項原則設定決定/var/log目錄是否啟用nosuid選項，以禁止/var/log目錄存在具有SUID屬性之檔案\nSUID(Set User ID)是針對可執行二進制檔案(Binary file)所設計之功能，任何使用者執行該程式時，會以該程式擁有者之身分執行，藉由短暫提權讓一般使用者存取未被授權之檔案\n可設定之參數如下：\nsuid：允許存在具有SUID屬性之檔案\nnosuid：禁止存在具有SUID屬性之檔案",
    "method": "編輯/etc/fstab檔案，在掛載點為/var/log列，於第4欄加入「,nosuid」\n開啟終端機，執行下列指令，重新掛載/var/log：\n#mount -o remount,nosuid /var/log",
    "expected": "啟用",
    "check_cmd": "(systemctl is-active chronyd 2>/dev/null || systemctl is-active systemd-timesyncd 2>/dev/null) | grep -q active && echo PASS || echo FAIL",
    "remediation": "sudo apt install chrony -y && sudo systemctl enable chronyd && sudo systemctl start chronyd\n或: sudo systemctl enable systemd-timesyncd && sudo systemctl start systemd-timesyncd"
  },
  {
    "id": "TWGCB-01-014-0021",
    "category": "磁碟與檔案系統",
    "name": "設定/var/log目錄之noexec選項",
    "description": "這項原則設定決定/var/log目錄是否啟用noexec選項，以禁止在/var/log目錄中啟動可執行二進制檔案\n/var/log目錄主要做為存放日誌檔案，禁止使用者啟動可執行二進制檔案，降低惡意程式感染風險\n可設定之參數如下：\nexec：允許啟動可執行二進制檔案\nnoexec：禁止啟動可執行二進制檔案",
    "method": "編輯/etc/fstab檔案，在掛載點為/var/log列，於第4欄加入「,noexec」\n開啟終端機，執行下列指令，重新掛載/var/log：\n#mount -o remount,noexec /var/log",
    "expected": "啟用",
    "check_cmd": "dpkg -l xserver-xorg* 2>/dev/null | grep -q '^ii' && echo FAIL || echo PASS",
    "remediation": "sudo apt purge xserver-xorg* -y（僅限伺服器環境）"
  },
  {
    "id": "TWGCB-01-014-0022",
    "category": "磁碟與檔案系統",
    "name": "設定/var/log/audit目錄之檔案系統",
    "description": "這項原則設定決定是否為/var/log/audit目錄建立獨立之分割磁區或邏輯磁區\n/var/log/audit目錄用來存放稽核日誌(Audit log)，可依實務需求設定適當磁區容量，以確保所有由auditd服務程序所產生之稽核日誌皆可順利儲存\n由於稽核日誌檔容量可能會過於巨大，為/var/log/audit目錄建立獨立之分割磁區或邏輯磁區，可避免系統儲存空間耗盡，同時可保護稽核紀錄",
    "method": "對於新安裝的系統，在系統安裝過程中建立自定義磁區，為/var/log/audit指定一個獨立磁區\n對於已安裝的系統，請先完成全系統備份後始進行磁區分割作業，使用邏輯磁區管理員建立獨立的/var/log/audit磁區之範例如下：\n情境說明：系統擁有1顆20GB的SCSI硬碟，目前已建立2個主要磁區，合計已使用5GB空間。針對剩餘硬碟空間使用LVM建立1個256MB的/var/log/audit邏輯磁區操作順序如下：\n#gdisk /dev/sda\n#n(新增磁區)\n#3(建立磁區編號)\n#enter(在First sector輸入)\n#+256M(在Last sector輸入)\n#8e00(變更Hex code，LVM磁區代碼)\n#w(寫入磁區分割表格)\n#partprobe(強制重新抓磁區分割表格)\n#pvcreate /dev/sda3(對/dev/sda3建立PV)\n#vgcreate -s 16M varlogadvg /dev/sda3(對/dev/sda3建立1個VG，VG名稱varlogadvg，且指定1個PE大小16MB)\n#vgdisplay(顯示目前系統VG狀態，本範例的Total PE數顯示為15)\n#lvcreate -l 15 -n varlogadlv varlogadvg (從varlogadvg分割出1個LV，LV名稱varlogadlv，並將15個PE配置給varlogadlv)\n#mkfs.xfs /dev/varlogadvg/varlogadlv(對/dev/varlogadvg/varlogadlv進行格式化)\n接著，編輯/etc/fstab檔案，新增或修改成以下內容：\n/dev/varlogadvg/varlogadlv /var/log/audit xfs defaults 0 0",
    "expected": "使用獨立之分割磁區或邏輯磁區",
    "check_cmd": "systemctl is-enabled avahi-daemon 2>/dev/null | grep -q enabled && echo FAIL || echo PASS",
    "remediation": "sudo systemctl stop avahi-daemon && sudo systemctl disable avahi-daemon && sudo apt purge avahi-daemon -y"
  },
  {
    "id": "TWGCB-01-014-0023",
    "category": "磁碟與檔案系統",
    "name": "設定/var/log/audit目錄之nodev選項",
    "description": "這項原則設定決定/var/log/audit目錄是否啟用nodev選項，以禁止在/var/log/audit目錄中建立裝置檔案\n由於/var/log/audit目錄用途不在於支援裝置，設定nodev選項以確保使用者無法在/var/log/audit目錄建立裝置檔案或存取隨機硬體裝置，降低惡意程式感染風險\n可設定之參數如下：\ndev：允許建立裝置檔案\nnodev：禁止建立裝置檔案",
    "method": "編輯/etc/fstab檔案，在掛載點為/var/log/audit列，於第4欄加入「,nodev」\n開啟終端機，執行下列指令，重新掛載/var/log/audit：\n#mount -o remount,nodev /var/log/audit",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled cups 2>/dev/null | grep -q enabled && echo FAIL || echo PASS",
    "remediation": "sudo systemctl stop cups && sudo systemctl disable cups"
  },
  {
    "id": "TWGCB-01-014-0024",
    "category": "磁碟與檔案系統",
    "name": "設定/var/log/audit目錄之nosuid選項",
    "description": "這項原則設定決定/var/log/audit目錄是否啟用nosuid選項，以禁止/var/log/audit目錄存在具有SUID屬性之檔案\nSUID(Set User ID)是針對可執行二進制檔案(Binary file)所設計之功能，任何使用者執行該程式時，會以該程式擁有者之身分執行，藉由短暫提權讓一般使用者存取未被授權之檔案\n可設定之參數如下：\nsuid：允許存在具有SUID屬性之檔案\nnosuid：禁止存在具有SUID屬性之檔案",
    "method": "編輯/etc/fstab檔案，在掛載點為/var/log/audit列，於第4欄加入「,nosuid」\n開啟終端機，執行下列指令，重新掛載/var/log/audit：\n#mount -o remount,nosuid /var/log/audit",
    "expected": "啟用",
    "check_cmd": "dpkg -s isc-dhcp-server 2>&1 | grep -q 'not installed' && echo PASS || echo FAIL",
    "remediation": "sudo apt purge isc-dhcp-server -y"
  },
  {
    "id": "TWGCB-01-014-0025",
    "category": "磁碟與檔案系統",
    "name": "設定/var/log/audit目錄之noexec選項",
    "description": "這項原則設定決定/var/log/audit目錄是否啟用noexec選項，以禁止在/var/log/audit目錄中啟動可執行二進制檔案\n/var/log/audit目錄主要做為存放audit日誌檔案，禁止使用者啟動可執行二進制檔案，降低惡意程式感染風險\n可設定之參數如下：\nexec：允許啟動可執行二進制檔案\nnoexec：禁止啟動可執行二進制檔案",
    "method": "編輯/etc/fstab檔案，在掛載點為/var/log/audit列，於第4欄加入「,noexec」\n開啟終端機，執行下列指令，重新掛載/var/log/audit：\n#mount -o remount,noexec /var/log/audit",
    "expected": "啟用",
    "check_cmd": "dpkg -s bind9 2>&1 | grep -q 'not installed' && echo PASS || echo FAIL",
    "remediation": "sudo apt purge bind9 -y"
  },
  {
    "id": "TWGCB-01-014-0026",
    "category": "磁碟與檔案系統",
    "name": "設定/home目錄之檔案系統",
    "description": "這項原則設定決定是否為/home目錄建立獨立之分割磁區或邏輯磁區\n/home目錄是系統預設的使用者家目錄(Home directory)。每當新增1個一般使用者帳號時，預設的使用者家目錄都會建立在/home目錄下\n為/home目錄建立獨立之分割磁區或邏輯磁區，可避免系統儲存空間耗盡，同時可限制欲存放之檔案類型\n請定期進行/home目錄之資料夾同步與備份，以確保系統穩定性與資料完整性，並避免因磁碟空間不足導致服務中斷",
    "method": "對於新安裝的系統，在系統安裝過程中建立自定義磁區，為/home指定一個獨立磁區\n對於已安裝的系統，請先完成全系統備份後始進行磁區分割作業，使用邏輯磁區管理員建立獨立的/home磁區之範例如下：\n情境說明：系統擁有1顆20GB的SCSI硬碟，目前已建立2個主要磁區，合計已使用5GB空間。針對剩餘硬碟空間使用LVM建立1個256MB的/home邏輯磁區操作順序如下：\n#gdisk /dev/sda\n#n(新增磁區)\n#3(建立磁區編號)\n#enter(在First sector輸入)\n#+256M(在Last sector輸入)\n#8e00(變更Hex code，LVM磁區代碼)\n#w(寫入磁區分割表格)\n#partprobe(強制重新抓磁區分割表格)\n#pvcreate /dev/sda3(對/dev/sda3建立PV)\n#vgcreate -s 16M homevg /dev/sda3(對/dev/sda3建立1個VG，VG名稱homevg，且指定1個PE大小16MB)\n#vgdisplay(顯示目前系統VG狀態，本範例的Total PE數顯示為15)\n#lvcreate -l 15 -n homelv homevg (從homevg分割出1個LV，LV名稱homelv，並將15個PE配置給homelv)\n#mkfs.xfs /dev/homevg/homelv(對/dev/homevg/homelv進行格式化)\n接著，編輯/etc/fstab檔案，新增或修改成以下內容：\n/dev/homevg/homelv /home xfs defaults  0  0",
    "expected": "使用獨立之分割磁區或邏輯磁區",
    "check_cmd": "dpkg -s vsftpd 2>&1 | grep -q 'not installed' && echo PASS || echo FAIL",
    "remediation": "sudo apt purge vsftpd -y"
  },
  {
    "id": "TWGCB-01-014-0027",
    "category": "磁碟與檔案系統",
    "name": "設定/home目錄之nodev選項",
    "description": "這項原則設定決定/home目錄是否啟用nodev選項，以禁止在/home目錄中建立裝置檔案\n/home目錄是系統預設的使用者家目錄(Home directory)。每當新增1個一般使用者帳號時，預設的使用者家目錄都會建立在/home目錄下\n由於/home目錄用途不在於支援裝置，設定nodev選項以確保使用者無法在/home目錄建立裝置檔案或存取隨機硬體裝置，降低惡意程式感染風險\n可設定之參數如下：\ndev：允許建立裝置檔案\nnodev：禁止建立裝置檔案",
    "method": "編輯/etc/fstab檔案，在掛載點為/home列，於第4欄加入「,nodev」\n開啟終端機，執行下列指令，重新掛載/home：\n#mount -o remount,nodev /home",
    "expected": "啟用",
    "check_cmd": "dpkg -s samba 2>&1 | grep -q 'not installed' && echo PASS || echo FAIL",
    "remediation": "sudo apt purge samba -y"
  },
  {
    "id": "TWGCB-01-014-0028",
    "category": "磁碟與檔案系統",
    "name": "設定/home目錄之nosuid選項",
    "description": "這項原則設定決定/home目錄是否啟用nosuid選項，以禁止/home目錄存在具有SUID屬性檔案\nSUID(Set User ID)是針對可執行二進制檔案(Binary file)所設計之功能，任何使用者執行該程式時，會以該程式擁有者之身分執行，藉由短暫提權讓一般使用者存取未被授權之檔案\n可設定之參數如下：\nsuid：允許存在具有SUID屬性之檔案\nnosuid：禁止存在具有SUID屬性之檔案",
    "method": "編輯/etc/fstab檔案，在掛載點為/home列，於第4欄加入「,nosuid」\n開啟終端機，執行下列指令，重新掛載/home：\n#mount -o remount,nosuid /home",
    "expected": "啟用",
    "check_cmd": "dpkg -s nfs-kernel-server 2>&1 | grep -q 'not installed' && echo PASS || echo FAIL",
    "remediation": "sudo apt purge nfs-kernel-server -y"
  },
  {
    "id": "TWGCB-01-014-0029",
    "category": "系統設定與維護",
    "name": "sudo套件",
    "description": "這項原則設定決定是否安裝sudo套件，sudo允許合法使用者按照所授予之帳號權限，以管理員身分(superuser)或其他使用者身分執行指令\nsudo預設設定檔為/etc/sudoers，將一般使用者帳號與所授予之權限設定在/etc/sudoers設定檔，一般使用者在需要取得特殊權限時，則可於指令前加上「sudo」並輸入使用者自己之通行碼，即可用管理員身分執行指令\n注意：建議可依系統維運與管理需求，適當賦予使用者執行sudo之權限，並可考量將各使用者之設定存放於不同設定檔中",
    "method": "開啟終端機，執行下列指令安裝sudo套件：\n#apt install sudo",
    "expected": "安裝",
    "check_cmd": "systemctl is-enabled rsync 2>/dev/null | grep -q enabled && echo FAIL || echo PASS",
    "remediation": "sudo systemctl stop rsync && sudo systemctl disable rsync"
  },
  {
    "id": "TWGCB-01-014-0030",
    "category": "系統設定與維護",
    "name": "設定sudo指令使用pty",
    "description": "這項原則設定決定是否僅能使用pty(pseudo terminal，虛擬終端)執行sudo指令\npty是一對提供雙向通訊的虛擬終端設備，分別為主要(master)與從屬(slave)設備，從屬設備模擬硬體終端機，主要設備則模擬終端機程序以操作控制從屬設備\n攻擊者在使用sudo執行惡意程序時，在主程序完成後可能會衍生另一個背景程序保留在終端設備上，sudo設定為使用pty時可避免此情況",
    "method": "開啟終端機，執行「visudo -f」指令編輯/etc/sudoers檔案或 /etc/sudoers.d/目錄下之檔案，新增以下內容：\nDefaults use_pty",
    "expected": "Defaults use_pty",
    "check_cmd": "sysctl net.ipv4.ip_forward 2>/dev/null | grep -q '= 0' && echo PASS || echo FAIL",
    "remediation": "sudo bash -c 'echo \"net.ipv4.ip_forward = 0\" >> /etc/sysctl.d/99-security.conf' && sudo sysctl -w net.ipv4.ip_forward=0"
  },
  {
    "id": "TWGCB-01-014-0031",
    "category": "系統設定與維護",
    "name": "sudo自定義日誌檔案",
    "description": "這項原則設定決定是否設定sudo自定義日誌檔案\n預設情況下sudo藉由syslog記錄日誌，但sudo可在設定檔(預設為/etc/sudoers)中自定義日誌檔案，有助於簡化sudo指令的稽核工作",
    "method": "開啟終端機，執行「visudo -f」指令編輯/etc/sudoers檔案或 /etc/sudoers.d/目錄下之檔案，新增以下內容：\nDefaults logfile=\"(日誌檔案路徑)\"\n日誌檔案路徑使用「/var/log/sudo.log」之範例如下：\nDefaults logfile=\"/var/log/sudo.log\"",
    "expected": "啟用",
    "check_cmd": "sysctl net.ipv4.conf.all.send_redirects 2>/dev/null | grep -q '= 0' && echo PASS || echo FAIL",
    "remediation": "sudo sysctl -w net.ipv4.conf.all.send_redirects=0 && sudo sysctl -w net.ipv4.conf.default.send_redirects=0\n寫入 /etc/sysctl.d/99-security.conf 永久生效"
  },
  {
    "id": "TWGCB-01-014-0032",
    "category": "系統設定與維護",
    "name": "sudo身分鑑別逾時時間",
    "description": "這項原則設定決定sudo身分鑑別逾時時間\nUbuntu預設情況下sudo會留存鑑別資訊15分鐘，在這段時間內除了第一次的sudo指令需要進行身分鑑別外，其餘sudo指令皆不需再次進行身分鑑別\n減少逾時時間可降低未經授權之特權帳號存取風險",
    "method": "開啟終端機，執行「visudo -f」指令編輯/etc/sudoers檔案或/etc/sudoers.d/目錄下之檔案，新增或修改以下內容，設定身分鑑別逾時時間為5分鐘：\nDefaults env_reset,timestamp_timeout=5",
    "expected": "5分鐘(含)以下，但須大於0",
    "check_cmd": "sysctl net.ipv4.conf.all.accept_source_route 2>/dev/null | grep -q '= 0' && echo PASS || echo FAIL",
    "remediation": "sudo sysctl -w net.ipv4.conf.all.accept_source_route=0\n寫入 /etc/sysctl.d/99-security.conf"
  },
  {
    "id": "TWGCB-01-014-0033",
    "category": "系統設定與維護",
    "name": "AIDE套件",
    "description": "這項原則設定決定是否安裝AIDE (Advanced Intrusion Detection Environment，先進入侵偵測環境)套件\nAIDE截取檔案系統狀態的快照，包括修改時間、權限及檔案雜湊，藉由將快照與檔案系統的當前狀態進行比較，以檢測系統變更情況，找出被修改或損毀之檔案\nAIDE可藉由檔案完整性檢查，協助系統管理者早期發現系統入侵跡象\n注意：建議可依系統維運與管理需求新增或調整AIDE規則",
    "method": "開啟終端機，執行以下指令安裝AIDE套件：\n#apt install aide aide-common\n執行以下指令初始化AIDE：\n#aideinit\n#mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db",
    "expected": "安裝",
    "check_cmd": "sysctl net.ipv4.conf.all.rp_filter 2>/dev/null | grep -q '= 1' && echo PASS || echo FAIL",
    "remediation": "sudo sysctl -w net.ipv4.conf.all.rp_filter=1\n寫入 /etc/sysctl.d/99-security.conf"
  },
  {
    "id": "TWGCB-01-014-0034",
    "category": "系統設定與維護",
    "name": "定期檢查檔案系統完整性",
    "description": "這項原則設定決定是否使用AIDE工具定期檢查檔案系統完整性\nAIDE截取檔案系統狀態的快照，包括修改時間、權限及檔案雜湊，藉由將快照與檔案系統的當前狀態進行比較，以檢測系統變更情況，找出被修改或損毀之檔案\n定期檢查檔案系統完整性，可協助系統管理者定期確認是否有重要檔案在未經授權的情況下被修改",
    "method": "開啟終端機，執行以下指令，編輯crontab：\n#crontab -u root -e\n在crontab新增以下內容，設定每天5點進行檔案系統完整性檢查：\n0 5 * * * /usr/bin/aide --config /etc/aide/aide.conf --check",
    "expected": "每天",
    "check_cmd": "sysctl net.ipv4.tcp_syncookies 2>/dev/null | grep -q '= 1' && echo PASS || echo FAIL",
    "remediation": "sudo sysctl -w net.ipv4.tcp_syncookies=1\n寫入 /etc/sysctl.d/99-security.conf"
  },
  {
    "id": "TWGCB-01-014-0035",
    "category": "系統設定與維護",
    "name": "開機載入程式設定檔之所有權",
    "description": "這項原則設定決定是否設定開機載入程式(GNU GRUB, GRUB)設定檔之擁有者與群組\nGRUB設定檔主要功能是用來記錄載入作業系統核心所使用之參數\n將GRUB設定檔之擁有者與擁有群組設為root，以防止非root使用者變更檔案內容\n備註：如果使用其他開機載入程式(如LILO或EFI GRUB)，請比照上述原則進行設定",
    "method": "若是基於BIOS的系統，開啟終端機，執行以下指令，設定GRUB設定檔之擁有者與群組：\n#chown root:root /boot/grub/grub.cfg\n#chown root:root /boot/grub/grubenv\n若是基於UEFI的系統，編輯/etc/fstab檔案，在掛載點為「/boot/efi」列，於第4欄加入「uid=0, and gid=0」，設定GRUB設定檔之擁有者與群組，範例如下：\n<device> /boot/efi vfat umask=0077,uid=0,gid=0 0 1",
    "expected": "root:root",
    "check_cmd": "sysctl net.ipv4.conf.all.accept_redirects 2>/dev/null | grep -q '= 0' && echo PASS || echo FAIL",
    "remediation": "sudo sysctl -w net.ipv4.conf.all.accept_redirects=0\n寫入 /etc/sysctl.d/99-security.conf"
  },
  {
    "id": "TWGCB-01-014-0036",
    "category": "系統設定與維護",
    "name": "開機載入程式設定檔之權限",
    "description": "這項原則設定決定是否設定開機載入程式(GNU GRUB, GRUB)設定檔之權限\nGRUB設定檔主要功能是用來記錄載入作業系統核心所使用之參數\n禁止群組與其他身分讀取、寫入及執行GRUB設定檔，以防止非root使用者取得或修改開機參數，進而危及系統安全\n備註：如果使用其他開機載入程式(如LILO或EFI GRUB)，請比照上述原則進行設定",
    "method": "若是基於BIOS的系統，開啟終端機，執行以下指令，設定GRUB設定檔之權限為600或更低權限：\n#chmod 600 /boot/grub/grub.cfg\n#chmod 600 /boot/grub/grubenv\n若是基於UEFI的系統，編輯/etc/fstab檔案，在掛載點為「/boot/efi」列，於第4欄加入「fmask=0177」，設定GRUB設定檔之權限，範例如下：\n<device> /boot/efi vfat umask=0077,fmask=0177 0 1",
    "expected": "600或更低權限",
    "check_cmd": "sysctl net.ipv4.conf.all.log_martians 2>/dev/null | grep -q '= 1' && echo PASS || echo FAIL",
    "remediation": "sudo sysctl -w net.ipv4.conf.all.log_martians=1\n寫入 /etc/sysctl.d/99-security.conf"
  },
  {
    "id": "TWGCB-01-014-0037",
    "category": "系統設定與維護",
    "name": "開機載入程式之通行碼",
    "description": "這項原則設定決定是否設定開機載入程式之通行碼，以限制需通過通行碼鑑別後，才能設定開機載入程式之參數\n設定通行碼保護開機載入程式，可避免攻擊者開機進入單一使用者或維護模式，不需鑑別root身分，即可取得系統上所有檔案之存取權限",
    "method": "開啟終端機，執行以下指令，使用grub-mkpasswd-pbkdf2建立一組通行碼：\n#grub-mkpasswd-pbkdf2\nEnter password: (輸入通行碼)\nConfirm password: (再次輸入通行碼)\n開啟終端機，編輯/etc/grub.d/40_custom檔案，新增以下內容：\nset superusers=\"(使用者名稱)\"\npassword_pbkdf2 (使用者名稱) (pbkdf2雜湊後通行碼)\n執行以下指令更新grub2設定檔：\n#update-grub",
    "expected": "設定通行碼",
    "check_cmd": "sysctl net.ipv4.icmp_echo_ignore_broadcasts 2>/dev/null | grep -q '= 1' && echo PASS || echo FAIL",
    "remediation": "sudo sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1\n寫入 /etc/sysctl.d/99-security.conf"
  },
  {
    "id": "TWGCB-01-014-0038",
    "category": "系統設定與維護",
    "name": "單一使用者模式身分鑑別",
    "description": "這項原則設定決定單一使用者模式(Single user mode)是否啟用身分鑑別功能\n當系統在開機載入過程發生問題時，將使用單一使用者模式(或稱為救援模式)進行還原\n設定單一使用者模式需使用身分鑑別，可防止攻擊者將系統重新開機後，不需身分鑑別即可進入單一使用者模式，進而危害系統安全",
    "method": "開啟終端機，執行以下指令，設定root帳號通行碼：\n#passwd root",
    "expected": "啟用",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 38 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0039",
    "category": "系統設定與維護",
    "name": "核心傾印功能",
    "description": "這項原則設定決定是否啟用核心傾印(Core dump)功能\n核心傾印檔案是程式異常終止時，系統將當時記憶體內容以檔案方式記錄下來所產生的記憶體映像檔案，可供程式除錯之用\n禁止使用者與SUID程式產生核心傾印檔案，避免核心傾印檔案洩露如記憶體位址或空間配置等機敏資訊",
    "method": "編輯/etc/security/limits.conf檔案或/etc/security/limits.d/目錄下之檔案，新增以下內容：\n* hard core 0\n編輯/etc/sysctl.conf或/etc/sysctl.d/目錄下之檔案，設定參數如下：\nfs.suid_dumpable=0\n開啟終端機，執行以下指令，設定核心參數：\n#sysctl -w fs.suid_dumpable=0\n如果已安裝systemd-coredump套件，編輯/etc/systemd/coredump.conf檔案，新增或修改成以下內容：\nStorage=none\nProcessSizeMax=0\n開啟終端機，執行以下指令重新載入systemd：\n#systemctl daemon-reload\n開啟終端機，執行以下指令，遮蔽systemd-coredump.socket服務：\n#systemctl --now mask systemd-coredump.socket",
    "expected": "停用",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 39 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0040",
    "category": "系統設定與維護",
    "name": "記憶體位址空間配置隨機載入",
    "description": "這項原則設定決定系統開機時是否立即啟用記憶體位址空間配置隨機載入(Address space layout randomization, ASLR)功能\nASLR利用隨機方式配置資料位址，使得機敏資料(例如作業系統核心程式)能配置到一個惡意程式未能事先得知之位址\n啟用記憶體位址空間配置隨機載入，增加攻擊難度，以降低緩衝區溢位攻擊之安全風險\n可設定參數如下：\n0：停用ASLR功能\n1：隨機配置堆疊(Stack)、記憶體映射函數(mmap)及vDSO(Virtual Dynamically-linked Shared Object，虛擬動態連結共享物件)頁\n2：隨機配置堆疊(Stack)、記憶體映射函數(mmap)、vDSO頁面及堆積(Heap)",
    "method": "編輯/etc/sysctl.conf檔案或/etc/sysctl.d/目錄下之檔案，設定參數如下：\nkernel.randomize_va_space=2\n開啟終端機，執行以下指令，設定核心參數：\n#sysctl -w kernel.randomize_va_space=2",
    "expected": "2",
    "check_cmd": "systemctl is-enabled auditd 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo apt install auditd -y && sudo systemctl enable auditd && sudo systemctl start auditd"
  },
  {
    "id": "TWGCB-01-014-0041",
    "category": "系統設定與維護",
    "name": "prelink套件",
    "description": "這項原則設定決定是否移除prelink套件\nprelink是一個修改動態連結函式庫的程式，可用以減少程式在啟動時動態連結器定址所花費的時間\n移除prelink套件以降低常見函式庫(如libc等)被攻擊與利用的風險",
    "method": "開啟終端機，執行以下指令，移除prelink套件：\n#apt purge prelink",
    "expected": "移除",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 41 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0042",
    "category": "系統設定與維護",
    "name": "自動錯誤回報服務",
    "description": "這項原則設定決定是否啟用自動錯誤回報服務(Apport Error Reporting Service)\n自動錯誤回報服務可能蒐集機敏資訊，如系統日誌與核心傾印等，其中可能包含通行碼與信用卡號等機敏資料\n停用自動錯誤回報服務，可降低機敏資料外洩之風險",
    "method": "開啟終端機，執行以下指令，停用apport服務：\n#systemctl --now mask apport.service",
    "expected": "停用",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 42 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0043",
    "category": "系統設定與維護",
    "name": "/etc/passwd檔案所有權",
    "description": "這項原則設定決定/etc/passwd檔案擁有者與群組\n/etc/passwd記錄每位使用者之名稱、通行碼、使用者ID、群組ID及家目錄等資訊\n設定/etc/passwd檔案擁有者與群組為root，避免/etc/passwd檔案遭未授權使用者修改，降低檔案被竄改後進一步利用於其他惡意攻擊之風險",
    "method": "開啟終端機，執行以下指令，設定/etc/passwd檔案所有權：\n#chown root:root /etc/passwd",
    "expected": "root:root",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo apt install rsyslog -y && sudo systemctl enable rsyslog && sudo systemctl start rsyslog"
  },
  {
    "id": "TWGCB-01-014-0044",
    "category": "系統設定與維護",
    "name": "/etc/passwd檔案權限",
    "description": "這項原則設定決定/etc/passwd檔案權限\n/etc/passwd記錄每位使用者之名稱、通行碼、使用者ID、群組ID及家目錄等資訊\n將/etc/passwd檔案權限設為僅root擁有讀取與寫入權限，其餘所有使用者僅可讀取，避免/etc/passwd檔案遭未授權使用者修改，降低檔案被竄改後進一步利用於其他惡意攻擊之風險",
    "method": "開啟終端機，執行以下指令，設定/etc/passwd檔案權限為644或更低權限：\n#chmod 644 /etc/passwd",
    "expected": "644或更低權限",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 44 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0045",
    "category": "系統設定與維護",
    "name": "/etc/shadow檔案所有權",
    "description": "這項原則設定決定/etc/shadow檔案擁有者與群組\n/etc/shadow記錄每個使用者帳號加密過後之通行碼、最後變更通行碼之日期及下次可變更通行碼前之經過天數等資訊\n若攻擊者取得/etc/shadow檔案後，可嘗試透過通行碼破解程式取得通行碼後進行攻擊\n設定/etc/shadow檔案擁有者與群組，以保護帳號通行碼資訊，降低檔案被竄改後進一步利用於其他惡意攻擊之風險",
    "method": "開啟終端機，執行以下任一指令，設定/etc/shadow檔案之所有權：\n#chown root:root /etc/shadow\n或\n#chown root:shadow /etc/shadow",
    "expected": "root:root或root:shadow",
    "check_cmd": "[ -f /etc/logrotate.conf ] && echo PASS || echo FAIL",
    "remediation": "sudo apt install logrotate -y\n確認 /etc/logrotate.conf 存在且設定正確"
  },
  {
    "id": "TWGCB-01-014-0046",
    "category": "系統設定與維護",
    "name": "/etc/shadow檔案權限",
    "description": "這項原則設定決定/etc/shadow檔案權限\n/etc/shadow記錄每個使用者帳號加密過後之通行碼、最後變更通行碼之日期及下次可變更通行碼前之經過天數等資訊\n若攻擊者取得/etc/shadow檔案後，可嘗試透過通行碼破解程式取得通行碼後進行攻擊\n將/etc/shadow檔案權限設為000(所有使用者不具有讀取、寫入及執行權限)，以保護帳號通行碼資訊，降低檔案被竄改後進一步利用於其他惡意攻擊之風險",
    "method": "開啟終端機，執行以下指令，設定/etc/shadow檔案權限為000：\n#chmod 000 /etc/shadow",
    "expected": "000",
    "check_cmd": "systemctl is-enabled apparmor 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable apparmor && sudo systemctl start apparmor\nsudo aa-enforce /etc/apparmor.d/*"
  },
  {
    "id": "TWGCB-01-014-0047",
    "category": "系統設定與維護",
    "name": "/etc/group檔案所有權",
    "description": "這項原則設定決定/etc/group檔案擁有者與群組\n/etc/group記錄每個群組之名稱、通行碼、ID及屬於該群組之使用者清單\n設定/etc/group檔案擁有者與群組為root，避免/etc/group檔案遭未授權使用者修改",
    "method": "開啟終端機，執行以下指令，設定/etc/group檔案所有權：\n#chown root:root /etc/group",
    "expected": "root:root",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 47 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0048",
    "category": "系統設定與維護",
    "name": "/etc/group檔案權限",
    "description": "這項原則設定決定/etc/group檔案權限\n/etc/group記錄每個群組之名稱、通行碼、ID及屬於該群組之使用者清單\n設定/etc/group檔案權限，僅root擁有讀寫權限，其餘所有使用者僅可讀取，避免/etc/group檔案遭未授權使用者修改",
    "method": "開啟終端機，執行以下指令，設定/etc/group檔案權限為644或更低權限：\n#chmod 644 /etc/group",
    "expected": "644或更低權限",
    "check_cmd": "systemctl is-enabled cron 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable cron && sudo systemctl start cron"
  },
  {
    "id": "TWGCB-01-014-0049",
    "category": "系統設定與維護",
    "name": "/etc/gshadow檔案所有權",
    "description": "這項原則設定決定/etc/gshadow檔案擁有者與群組\n/etc/gshadow記錄每個群組加密過後之通行碼，以及使用者與管理者資訊，攻擊者讀取/etc/gshadow檔案後，可嘗試透過通行碼破解程式取得通行碼後進行攻擊\n設定/etc/gshadow檔案擁有者與群組，以保護群組帳號通行碼資訊，降低檔案被竄改後進一步利用於其他惡意攻擊之風險",
    "method": "開啟終端機，執行以下任一指令，設定/etc/gshadow檔案所有權：\n#chown root:root /etc/gshadow\n或\n#chown root:shadow /etc/gshadow",
    "expected": "root:root或root:shadow",
    "check_cmd": "stat -c '%a' /etc/crontab 2>/dev/null | grep -q '600' && echo PASS || echo FAIL",
    "remediation": "sudo chmod 600 /etc/crontab && sudo chown root:root /etc/crontab"
  },
  {
    "id": "TWGCB-01-014-0050",
    "category": "系統設定與維護",
    "name": "/etc/gshadow檔案權限",
    "description": "這項原則設定決定/etc/gshadow檔案權限\n/etc/gshadow記錄每個群組加密過後之通行碼，以及使用者與管理者資訊，攻擊者讀取/etc/gshadow檔案後，可嘗試透過通行碼破解程式取得通行碼後進行攻擊\n設定/etc/gshadow檔案權限為000(所有使用者不具有讀取、寫入及執行權限)，以保護群組帳號通行碼資訊，降低檔案被竄改後進一步利用於其他惡意攻擊之風險",
    "method": "開啟終端機，執行以下指令，設定/etc/gshadow檔案權限為000：\n#chmod 000 /etc/gshadow",
    "expected": "000",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 50 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0051",
    "category": "系統設定與維護",
    "name": "/etc/passwd-檔案所有權",
    "description": "這項原則設定決定/etc/passwd-檔案擁有者與群組\n/etc/passwd-備份每位使用者之名稱、通行碼、使用者ID、群組ID及家目錄等資訊\n設定/etc/passwd-檔案擁有者與群組為root，避免/etc/passwd-檔案遭未授權使用者修改，降低檔案被竄改後進一步利用於其他惡意攻擊之風險",
    "method": "開啟終端機，執行以下指令，設定/etc/passwd-檔案之所有權：\n#chown root:root /etc/passwd-",
    "expected": "root:root",
    "check_cmd": "awk '/^PASS_MAX_DAYS/{if($2<=90)print \"PASS\";else print \"FAIL\"}' /etc/login.defs",
    "remediation": "sudo sed -i 's/^PASS_MAX_DAYS.*/PASS_MAX_DAYS 90/' /etc/login.defs"
  },
  {
    "id": "TWGCB-01-014-0052",
    "category": "系統設定與維護",
    "name": "/etc/passwd-檔案權限",
    "description": "這項原則設定決定/etc/passwd-檔案權限\n/etc/passwd-備份每位使用者之名稱、通行碼、使用者ID、群組ID及家目錄等資訊\n設定/etc/passwd-檔案權限，僅root擁有讀取與寫入權限，其餘所有使用者僅可讀取，避免/etc/passwd-檔案遭未授權使用者修改，降低檔案被竄改後進一步利用於其他惡意攻擊之風險",
    "method": "開啟終端機，執行以下指令，設定/etc/passwd-檔案權限為644或更低權限：\n#chmod 644 /etc/passwd-",
    "expected": "644或更低權限",
    "check_cmd": "awk '/^PASS_MIN_DAYS/{if($2>=7)print \"PASS\";else print \"FAIL\"}' /etc/login.defs",
    "remediation": "sudo sed -i 's/^PASS_MIN_DAYS.*/PASS_MIN_DAYS 7/' /etc/login.defs"
  },
  {
    "id": "TWGCB-01-014-0053",
    "category": "系統設定與維護",
    "name": "/etc/shadow-檔案所有權",
    "description": "這項原則設定決定/etc/shadow-檔案擁有者與群組\n/etc/shadow-備份每個使用者帳號加密過後之通行碼、最後變更通行碼之日期及下次可變更通行碼前之經過天數等資訊\n若攻擊者取得/etc/shadow-檔案，可嘗試透過通行碼破解程式取得通行碼後進行攻擊\n設定/etc/shadow-檔案所有權，以保護帳號通行碼資訊，降低檔案被竄改後進一步利用於其他惡意攻擊之風險",
    "method": "開啟終端機，執行以下任一指令，設定/etc/shadow-檔案之所有權：\n#chown root:root /etc/shadow-\n或\n#chown root:shadow /etc/shadow-",
    "expected": "root:root或root:shadow",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 53 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0054",
    "category": "系統設定與維護",
    "name": "/etc/shadow-檔案權限",
    "description": "這項原則設定決定/etc/shadow-檔案權限\n/etc/shadow-備份每個使用者帳號加密過後之通行碼、最後變更通行碼之日期及下次可變更通行碼前之經過天數等資訊\n若攻擊者取得/etc/shadow-檔案，可嘗試透過通行碼破解程式取得通行碼後進行攻擊\n設定/etc/shadow-檔案權限為000(所有使用者不具有讀取、寫入及執行權限)，以保護帳號通行碼資訊，降低檔案被竄改後進一步利用於其他惡意攻擊之風險",
    "method": "開啟終端機，執行以下指令，設定/etc/shadow-檔案權限為000：\n# chmod 000 /etc/shadow-",
    "expected": "000",
    "check_cmd": "grep -qE '^minlen\\s*=\\s*1[2-9]|^minlen\\s*=\\s*[2-9][0-9]' /etc/security/pwquality.conf 2>/dev/null && echo PASS || echo FAIL",
    "remediation": "sudo apt install libpam-pwquality -y\nsudo sed -i 's/^# minlen.*/minlen = 12/' /etc/security/pwquality.conf"
  },
  {
    "id": "TWGCB-01-014-0055",
    "category": "系統設定與維護",
    "name": "/etc/group-檔案所有權",
    "description": "這項原則設定決定/etc/group-檔案擁有者與群組\n/etc/group-備份每個群組之名稱、通行碼、ID及屬於該群組之使用者清單\n設定/etc/group-檔案擁有者與群組為root，避免/etc/group-檔案遭未授權使用者修改",
    "method": "開啟終端機，執行以下指令，設定/etc/group-檔案所有權：\n#chown root:root /etc/group-",
    "expected": "root:root",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 55 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0056",
    "category": "系統設定與維護",
    "name": "/etc/group-檔案權限",
    "description": "這項原則設定決定/etc/group-檔案權限\n/etc/group-備份每個群組之名稱、通行碼、ID及屬於該群組之使用者清單\n設定/etc/group-檔案權限，僅root擁有讀取與寫入權限，其餘所有使用者僅可讀取，避免/etc/group-檔案遭未授權使用者修改",
    "method": "開啟終端機，執行以下指令，設定/etc/group-檔案權限為644或更低權限：\n#chmod 644 /etc/group-",
    "expected": "644或更低權限",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 56 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0057",
    "category": "系統設定與維護",
    "name": "/etc/gshadow-檔案所有權",
    "description": "這項原則設定決定/etc/gshadow-檔案擁有者與群組\n/etc/gshadow-備份每個群組加密過後之通行碼，以及使用者與管理者資訊，攻擊者讀取/etc/gshadow-檔案後，可嘗試透過通行碼破解程式取得通行碼後進行攻擊\n設定/etc/gshadow-檔案所有權，以保護群組帳號通行碼資訊，降低檔案被竄改後進一步利用於其他惡意攻擊之風險",
    "method": "開啟終端機，執行以下任一指令，設定/etc/gshadow-檔案之所有權：\n#chown root:root /etc/gshadow-\n或\n#chown root:shadow /etc/gshadow-",
    "expected": "root:root或root:shadow",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 57 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0058",
    "category": "系統設定與維護",
    "name": "/etc/gshadow-檔案權限",
    "description": "這項原則設定決定/etc/gshadow-檔案權限\n/etc/gshadow-備份每個群組加密過後之通行碼，以及使用者與管理者資訊，若攻擊者讀取/etc/gshadow-檔案後，可嘗試透過通行碼破解程式取得通行碼後進行攻擊\n設定/etc/gshadow-檔案權限為000(所有使用者不具有讀取、寫入及執行權限)，以保護群組帳號通行碼資訊，降低檔案被竄改後進一步利用於其他惡意攻擊之風險",
    "method": "開啟終端機，執行以下指令，設定/etc/gshadow-檔案權限為000：\n#chmod 000 /etc/gshadow-",
    "expected": "000",
    "check_cmd": "sshd -T 2>/dev/null | grep -qi 'permitrootlogin no' && echo PASS || echo FAIL",
    "remediation": "sudo sed -i 's/^#\\?PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config && sudo systemctl restart sshd"
  },
  {
    "id": "TWGCB-01-014-0059",
    "category": "系統設定與維護",
    "name": "其他使用者寫入具有全域寫入權限之檔案",
    "description": "這項原則設定決定其他使用者是否允許寫入具有全域寫入(World-writable)權限之檔案\n具有全域寫入權限之檔案可被任何使用者修改，錯誤或不完整的程式碼將可能影響系統運作或危害系統安全\n設定其他使用者不能寫入具有全域寫入權限之檔案，以避免系統重要檔案被未經授權竄改",
    "method": "開啟終端機，執行以下指令，在系統上所有磁區(partition)，逐一檢查磁區所掛載之檔案目錄(如根目錄)，找出具有全域寫入權限(World-writable)之檔案：\n#find (partition) -xdev -type f -perm -0002\n針對所找到之檔案，執行下列指令，以移除其他身分寫入權限：\n#chmod o-w (檔案名稱)",
    "expected": "禁止寫入",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 59 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0060",
    "category": "系統設定與維護",
    "name": "檢查所有檔案與目錄之擁有者",
    "description": "這項原則設定決定是否所有檔案與目錄擁有者皆為合法使用者\n不屬於合法使用者之檔案可能是由攻擊者植入、不正確的軟體安裝、不完整的軟體移除或已遭刪除使用者所遺留之檔案\n確認所有檔案與目錄擁有者皆為合法使用者，以避免新使用者帳號與已被刪除使用者帳號相同時，可以存取前任使用者所建立之檔案，將可能存取未被授權之檔案",
    "method": "開啟終端機，執行以下指令，在系統上所有磁區(partition)，逐一檢查磁區所掛載之檔案目錄(如根目錄)，找出擁有者不是合法使用者之檔案或目錄：\n#find (partition) -xdev -nouser\n針對所找到之檔案與目錄指定合法使用者或移除：\n#chown (使用者) (檔案名稱或目錄名稱)\n或\n#rm (檔案名稱或目錄名稱)",
    "expected": "所有檔案與目錄擁有者皆為合法使用者",
    "check_cmd": "sshd -T 2>/dev/null | grep -qi 'permitemptypasswords no' && echo PASS || echo FAIL",
    "remediation": "sudo sed -i 's/^#\\?PermitEmptyPasswords.*/PermitEmptyPasswords no/' /etc/ssh/sshd_config && sudo systemctl restart sshd"
  },
  {
    "id": "TWGCB-01-014-0061",
    "category": "系統設定與維護",
    "name": "檢查所有檔案與目錄之擁有群組",
    "description": "這項原則設定決定是否所有檔案與目錄擁有群組皆為合法群組\n不屬於合法群組之檔案可能是由攻擊者植入、不正確的軟體安裝、不完整的軟體移除或已遭刪除使用者所遺留之檔案\n確認所有檔案與目錄擁有群組皆為合法群組，以避免新使用者帳號與已被刪除使用者帳號相同時，可以存取前任使用者所屬群組之檔案，將可能存取未被授權之檔案",
    "method": "開啟終端機，執行以下指令，在系統上所有磁區(partition)，逐一檢查磁區所掛載之檔案目錄(如根目錄)，找出擁有群組不是合法群組之檔案或目錄：\n#find (partition) -xdev -nogroup\n針對所找到之檔案與目錄指定合法群組或移除：\n#chgrp (群組) (檔案名稱或目錄名稱)\n或\n#rm (檔案名稱或目錄名稱)",
    "expected": "所有檔案與目錄擁有群組皆為合法群組",
    "check_cmd": "sshd -T 2>/dev/null | grep -qi 'maxauthtries [1-4]$' && echo PASS || echo FAIL",
    "remediation": "sudo sed -i 's/^#\\?MaxAuthTries.*/MaxAuthTries 4/' /etc/ssh/sshd_config && sudo systemctl restart sshd"
  },
  {
    "id": "TWGCB-01-014-0062",
    "category": "系統設定與維護",
    "name": "帳號不使用空白通行碼",
    "description": "這項原則設定決定是否允許存在使用空白通行碼之帳號\n使用空白通行碼意謂著任何人皆可以此帳號登入系統，並以該帳號之權限執行相關指令，將可能危害系統安全\n設定帳號都必須具有通行碼或被鎖定，以防止未經授權之使用者登入該帳號",
    "method": "開啟終端機，執行以下指令，列出使用空白通行碼之帳號：\n#awk -F: '($2 == \"\" ) { print $1 \" does not have a password \"}' /etc/shadow\n若有使用空白通行碼之帳號，則執行下列指令以設定通行碼：\n#passwd (帳號名稱)\n或執行下列指令以鎖定帳號：\n#passwd -l (帳號名稱)",
    "expected": "帳號必須具有通行碼或被鎖定",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 62 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0063",
    "category": "系統設定與維護",
    "name": "root帳號之路徑變數",
    "description": "這項原則設定決定是否允許root帳號之路徑(PATH)變數存在相對路徑或空目錄(例如：「.」、「..」、路徑開頭不是「/」及空元素)\nroot帳號可以執行系統上所有指令，若PATH設定錯誤，root將可能執行到偽裝的程式檔案，危害系統安全\n.：目前目錄\n..：上一層目錄",
    "method": "開啟終端機，執行以下指令，顯示PATH變數內容：\n#echo $PATH\n如出現「.」、「..」、路徑開頭不是「/」及空元素等內容，請編輯/etc/profile檔案進行修改",
    "expected": "不允許「.」、「..」、路徑開頭不是「/」及空元素",
    "check_cmd": "stat -c '%a' /etc/passwd | grep -q '644' && echo PASS || echo FAIL",
    "remediation": "sudo chmod 644 /etc/passwd && sudo chown root:root /etc/passwd"
  },
  {
    "id": "TWGCB-01-014-0064",
    "category": "系統設定與維護",
    "name": "UID=0之帳號",
    "description": "這項原則設定決定系統除了root帳號外，其他帳號之UID是否允許設為0\nUID=0之帳號具有系統管理權限",
    "method": "開啟終端機，執行以下指令，列出UID=0之帳號：\n#awk -F: '($3 == 0) { print $1 }' /etc/passwd\n若存在非root帳號，則執行以下指令，移除帳號或重新設定UID：\n#userdel (帳號名稱)\n或\n#usermod -u (UID) (帳號名稱)",
    "expected": "僅root帳號之UID為0",
    "check_cmd": "stat -c '%a' /etc/shadow | grep -qE '640|600' && echo PASS || echo FAIL",
    "remediation": "sudo chmod 640 /etc/shadow && sudo chown root:shadow /etc/shadow"
  },
  {
    "id": "TWGCB-01-014-0065",
    "category": "系統設定與維護",
    "name": "使用者家目錄權限",
    "description": "這項原則設定決定使用者家目錄權限\n使用者家目錄是系統預設的使用者主目錄，目錄下存放使用者的環境設定與個人檔案，因此任何使用者皆不應具有可寫入其他使用者家目錄之權限\n使用者家目錄應限制群組不具寫入(g-w)權限，其他使用者不具讀取、寫入及執行(o-rwx)權限，避免遭未經授權存取與竊取資料",
    "method": "開啟終端機，執行以下腳本，檢查每個使用者家目錄權限：\n#!/bin/bash\ngrep -E -v '^(halt|sync|shutdown)' /etc/passwd | awk -F: '($7 != \"/usr/sbin/nologin\" && $7 != \"/sbin/nologin\" && $7 != \"/bin/false\") { print $1 \" \" $6 }' | while read user dir; do\n  if [ ! -d \"$dir\" ]; then\n    echo \"The home directory ($dir) of user $user does not exist.\"\n  else\n    dirperm=$(ls -ld $dir | cut -f1 -d\" \")\n    if [ $(echo $dirperm | cut -c5) != \"-\" ]; then\n      echo \"Group Read permission set on the home directory ($dir) of user $user\"\n    fi\n    if [ $(echo $dirperm | cut -c6) != \"-\" ]; then\n      echo \"Group Write permission set on the home directory ($dir) of user $user\"\n    fi\n    if [ $(echo $dirperm | cut -c7) != \"-\" ]; then\n      echo \"Group Execute permission set on the home directory ($dir) of user $user\"\n    fi\n    if [ $(echo $dirperm | cut -c8) != \"-\" ]; then\n      echo \"Other Read permission set on the home directory ($dir) of user $user\"\n    fi\n    if [ $(echo $dirperm | cut -c9) != \"-\" ]; then\n      echo \"Other Write permission set on the home directory ($dir) of user $user\"\n    fi\n    if [ $(echo $dirperm | cut -c10) != \"-\" ]; then\n      echo \"Other Execute permission set on the home directory ($dir) of user $user\"\n    fi\n  fi\ndone\n若出現群組具寫入權限，其他使用者具讀取、寫入及執行權限之家目錄，則可執行以下指令，變更目錄權限為700或更低權限：\n#chmod 700 /home/(使用者帳號名稱)\n注意：請先通知使用者再變更家目錄相關設定，以避免影響使用者作業",
    "expected": "700或更低權限",
    "check_cmd": "awk -F: '$3==0{print $1}' /etc/passwd | wc -l | grep -q '^1$' && echo PASS || echo FAIL",
    "remediation": "檢查 /etc/passwd 中 UID=0 的帳號，確保只有 root:\nawk -F: '$3==0{print $1}' /etc/passwd\n如有其他帳號，請修改其 UID 或移除"
  },
  {
    "id": "TWGCB-01-014-0066",
    "category": "系統設定與維護",
    "name": "使用者家目錄擁有者",
    "description": "這項原則設定決定使用者家目錄擁有者是否為使用者\n使用者家目錄是系統預設的使用者主目錄，目錄下存放使用者的環境設定與個人檔案\n設定使用者家目錄為使用者擁有，以確保使用者個人資料安全",
    "method": "開啟終端機，執行以下腳本，檢查每個使用者家目錄擁有者：\n#!/bin/bash\ngrep -E -v '^(halt|sync|shutdown)' /etc/passwd | awk -F: '($7 != \"/usr/sbin/nologin\" && $7 != \"/sbin/nologin\" && $7 != \"/bin/false\") { print $1 \" \" $6 }' | while read user dir; do\n  if [ ! -d \"$dir\" ]; then\n    echo \"The home directory ($dir) of user $user does not exist.\"\n  else\n    owner=$(stat -L -c \"%U\" \"$dir\")\n    if [ \"$owner\" != \"$user\" ]; then\n  echo \"The home directory ($dir) of user $user is owned by $owner.\"\n  fi\nfi\ndone\n若出現使用者家目錄非使用者擁有，則可執行以下指令，變更家目錄擁有者為使用者：\n#chown (使用者帳號名稱) /home/(使用者帳號名稱)\n注意：請先通知使用者再變更家目錄相關設定，以避免影響使用者作業",
    "expected": "使用者擁有",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 66 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0067",
    "category": "系統設定與維護",
    "name": "使用者家目錄擁有群組",
    "description": "這項原則設定決定使用者家目錄擁有群組是否為使用者群組\n使用者家目錄是系統預設的使用者主目錄，目錄下存放使用者的環境設定與個人檔案\n若使用者家目錄擁有群組GID與使用者群組GID不同，將導致其他使用者可存取該使用者之檔案\n設定使用者家目錄為使用者群組擁有，以確保使用者個人資料安全",
    "method": "開啟終端機，執行以下腳本，檢查每個使用者家目錄之擁有群組GID：\n#!/bin/bash\ngrep -E -v '^(halt|sync|shutdown)' /etc/passwd | awk -F: '($7 != \"/usr/sbin/nologin\" && $7 != \"/sbin/nologin\" && $7 != \"/bin/false\") { print $1 \" \" $4 \" \" $6 }' | while read user gid dir; do\n  if [ ! -d \"$dir\" ]; then\n    echo \"The home directory ($dir) of user $user does not exist.\"\n  else\n    owner=$(stat -L -c \"%g\" \"$dir\")\n    if [ \"$owner\" != \"$gid\" ]; then\n  echo \"The home directory ($dir) of group $gid is owned by group $owner.\"\n  fi\nfi\ndone\n若出現使用者家目錄非使用者群組所擁有，則可執行以下指令，變更家目錄擁有者為使用者群組：\n#chgrp (使用者群組名稱或GID) /home/(使用者帳號名稱)\n注意：請先通知使用者再變更家目錄相關設定，以避免影響使用者作業",
    "expected": "使用者群組擁有",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 67 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0068",
    "category": "系統設定與維護",
    "name": "使用者家目錄之「.」檔案權限",
    "description": "這項原則設定決定是否設定使用者家目錄之「.」檔案權限，使用者家目錄之「.」檔案包含使用者之初始化檔案與其他設定檔\n限制使用者家目錄之「.」檔案寫入權限，以避免惡意人士藉由竊取或修改使用者資料，進而取得該使用者之系統權限",
    "method": "開啟終端機，執行以下腳本，檢查每個使用者家目錄之「.」檔案權限：\n#!/bin/bash\ngrep -E -v '^(halt|sync|shutdown)' /etc/passwd | awk -F: '($7 != \"/usr/sbin/nologin\" && $7 != \"/sbin/nologin\" && $7 != \"/bin/false\") { print $1 \" \" $6 }' | while read user dir; do\n  if [ ! -d \"$dir\" ]; then\n    echo \"The home directory ($dir) of user $user does not exist.\"\n  else\n    for file in $dir/.[A-Za-z0-9]*; do\n      if [ ! -h \"$file\" -a -f \"$file\" ]; then\n        fileperm=$(ls -ld $file | cut -f1 -d\" \")\n        if [ $(echo $fileperm | cut -c6) != \"-\" ]; then\n          echo \"Group Write permission set on file $file\"\n        fi\n        if [ $(echo $fileperm | cut -c9) != \"-\" ]; then\n          echo \"Other Write permission set on file $file\"\n        fi\n      fi\n    done\n  fi\ndone\n若出現具有world-writable或group-writable權限之「.」檔案，則可執行以下指令，移除群組與其他身分之寫入權限或更低權限：\n#chmod go-w (檔案名稱)\n注意：請先通知使用者再變更家目錄相關設定，以避免影響使用者作業",
    "expected": "go-w或更低權限",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 68 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0069",
    "category": "系統設定與維護",
    "name": "使用者家目錄之「.forward」檔案",
    "description": "這項原則設定決定是否移除使用者家目錄之「.forward」檔案\n「.forward」檔案用於設定將使用者郵件轉發到指定之電子郵件信箱\n移除「.forward」檔案以停用郵件轉發功能，避免機敏資料外洩",
    "method": "開啟終端機，執行以下腳本，檢查每個使用者家目錄是否存在「.forward」檔案：\n#!/bin/bash\ngrep -E -v '^(root|halt|sync|shutdown)' /etc/passwd | awk -F: '($7 != \"/usr/sbin/nologin\" && $7 != \"/sbin/nologin\" && $7 != \"/bin/false\") { print $1 \" \" $6 }' | while read user dir; do\n  if [ ! -d \"$dir\" ]; then\n    echo \"The home directory ($dir) of user $user does not exist.\"\n  else\n    if [ ! -h \"$dir/.forward\" -a -f \"$dir/.forward\" ]; then\n      echo \".forward file $dir/.forward exists\"\n    fi\n  fi\ndone\n若存在「.forward」檔案，則可執行以下指令移除檔案：\n#rm (檔案名稱)\n注意：請先通知使用者再變更家目錄相關設定，以避免影響使用者作業",
    "expected": "移除",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 69 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0070",
    "category": "系統設定與維護",
    "name": "使用者家目錄之「.netrc」檔案",
    "description": "這項原則設定決定是否移除使用者家目錄之「.netrc」檔案\n「.netrc」檔案包含用於登入遠端FTP主機進行檔案傳輸之帳號與明文通行碼，移除「.netrc」檔案以避免對遠端FTP主機造成之風險",
    "method": "開啟終端機，執行以下腳本，檢查每個使用者家目錄是否存在「.netrc」檔案：\n#!/bin/bash\ngrep -E -v '^(root|halt|sync|shutdown)' /etc/passwd | awk -F: '($7 != \"/usr/sbin/nologin\" && $7 != \"/sbin/nologin\" && $7 != \"/bin/false\") { print $1 \" \" $6 }' | while read user dir; do\n  if [ ! -d \"$dir\" ]; then\n    echo \"The home directory ($dir) of user $user does not exist.\"\n  else\n    if [ ! -h \"$dir/.netrc\" -a -f \"$dir/.netrc\" ]; then\n      echo \".netrc file $dir/.netrc exists\"\n    fi\n  fi\ndone\n若存在「.netrc」檔案，則可執行以下指令移除檔案：\n#rm (檔案名稱)\n注意：請先通知使用者再變更家目錄相關設定，以避免影響使用者作業",
    "expected": "移除",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 70 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0071",
    "category": "系統設定與維護",
    "name": "使用者家目錄之「.rhosts」檔案",
    "description": "這項原則設定決定是否移除使用者家目錄之「.rhosts」檔案\n「.rhosts」檔案用於指定那個使用者可以不需要輸入通行碼即可執行rsh遠端連線，移除「.rhosts」檔案以避免遭惡意人士取得可攻擊其他遠端主機之資訊",
    "method": "開啟終端機，執行以下腳本，檢查每個使用者家目錄是否存在「.rhosts」檔案：\n#!/bin/bash\ngrep -E -v '^(root|halt|sync|shutdown)' /etc/passwd | awk -F: '($7 != \"/usr/sbin/nologin\" && $7 != \"/sbin/nologin\" && $7 != \"/bin/false\") { print $1 \" \" $6 }' | while read user dir; do\n  if [ ! -d \"$dir\" ]; then\n    echo \"The home directory ($dir) of user $user does not exist.\"\n  else\n    for file in $dir/.rhosts; do\n      if [ ! -h \"$file\" -a -f \"$file\" ]; then\n        echo \".rhosts file in $dir\"\n      fi\n    done\n  fi\ndone\n若存在「.rhosts」檔案，則可執行以下指令移除檔案：\n#rm (檔案名稱)\n注意：請先通知使用者再變更家目錄相關設定，以避免影響使用者作業",
    "expected": "移除",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 71 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0072",
    "category": "系統設定與維護",
    "name": "檢查/etc/passwd檔案設定之通行碼",
    "description": "這項原則設定決定是否檢查/etc/passwd檔案設定之通行碼欄位，是否皆以「x」表示，以表示使用/etc/shadow檔案設定之通行碼執行身分鑑別\n將通行碼直接設定在/etc/passwd將使得任意使用者皆可獲取其雜湊值，並進行破密攻擊，對系統安全構成威脅",
    "method": "開啟終端機，執行以下指令，檢查是否有帳號之通行碼直接設定在/etc/passwd檔案當中：\nawk -F: '($2 != \"x\" ) { print $1 \" is not set to shadowed passwords \"}' /etc/passwd\n若有帳號之通行碼存在於/etc/passwd檔案中，執行以下指令，將通行碼儲存至/etc/shadow檔案：\nsed -e 's/^\\([a-zA-Z0-9_]*\\):[^:]*:/\\1:x:/' -i /etc/passwd\npasswd (帳號名稱)",
    "expected": "/etc/passwd檔案中之通行碼欄位皆須設為「x」",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 72 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0073",
    "category": "系統設定與維護",
    "name": "檢查/etc/passwd檔案設定之群組",
    "description": "這項原則設定決定是否檢查/etc/passwd檔案設定之群組，是否都存在於/etc/group檔案中\n在/etc/passwd檔案中，使用者帳號設定之群組，若不存在於/etc/group檔案中，代表群組權限管理不恰當，將可能對系統安全構成威脅",
    "method": "開啟終端機，執行以下腳本，檢查/etc/passwd檔案中帳號之群組是否都存在於/etc/group檔案中：\n#!/bin/bash\nfor i in $(cut -s -d: -f4 /etc/passwd | sort -u ); do\n  grep -q -P \"^.*?:[^:]*:$i:\" /etc/group\n  if [ $? -ne 0 ]; then\n    echo \"Group $i is referenced by /etc/passwd but does not exist in /etc/group\"\n  fi\ndone\n若有帳號之群組不存在於/etc/group檔案中，則編輯/etc/passwd檔案，或執行以下指令，修改帳號的群組(GID)：\n#usermod -g (群組名稱或GID) (帳號名稱)",
    "expected": "/etc/passwd檔案中帳號之群組皆須存在於/etc/group檔案中",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 73 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0074",
    "category": "系統設定與維護",
    "name": "唯一之UID",
    "description": "這項原則設定決定是否檢查/etc/passwd檔案之使用者帳號UID(User Identifier，使用者識別碼)皆不相同\n儘管透過useradd指令新增使用者帳號時，不允許建立重複之UID，但系統管理者可手動編輯/etc/passwd檔案並更改UID，造成UID重複之情形\n為每個使用者帳號設定唯一之UID，以提供適當之存取防護",
    "method": "開啟終端機，執行以下腳本，尋找是否有不同帳號使用相同的UID：\n#!/bin/bash\ncut -f3 -d\":\" /etc/passwd | sort -n | uniq -c | while read x ; do\n  [ -z \"$x\" ] && break\n  set - $x\n  if [ $1 -gt 1 ]; then\n    users=$(awk -F: '($3 == n) { print $1 }' n=$2 /etc/passwd | xargs)\n    echo \"Duplicate UID ($2): $users\"\n  fi\ndone\n若有不同帳號使用相同的UID，則編輯/etc/passwd檔案，或執行以下指令，為帳號設定唯一的UID：\n#usermod -u (UID) (帳號名稱)",
    "expected": "為每個帳號設定唯一之UID",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 74 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0075",
    "category": "系統設定與維護",
    "name": "唯一之GID",
    "description": "這項原則設定決定是否檢查/etc/group檔案之群組GID(Group Identifier，群組識別碼)皆不相同\n儘管透過groupadd指令新增群組時，不允許建立重複之GID，但系統管理者可手動編輯/etc/group檔案並更改GID，造成GID重複之情形\n為每個群組設定唯一之GID，以提供適當之存取防護",
    "method": "開啟終端機，執行以下腳本，尋找是否有群組使用相同之GID：\n#!/bin/bash\ncut -d: -f3 /etc/group | sort | uniq -d | while read x ; do\n  echo \"Duplicate GID ($x) in /etc/group\"\ndone\n若有不同群組使用相同GID，則編輯/etc/group檔案，或執行以下指令，為群組設定唯一之GID：\n#groupmod -g (GID) (群組名稱)",
    "expected": "為每個群組設定唯一之GID",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 75 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0076",
    "category": "系統設定與維護",
    "name": "唯一之使用者帳號名稱",
    "description": "這項原則設定決定是否檢查/etc/passwd檔案之使用者帳號名稱，並確認每個使用者帳號名稱皆不相同\n儘管透過useradd指令新增使用者帳號時，不允許建立重複之帳號名稱，但系統管理者可手動編輯/etc/passwd檔案並更改帳號名稱，造成帳號名稱重複之情形\n為每個使用者帳號設定唯一之名稱，以提供適當之存取防護",
    "method": "開啟終端機，執行以下腳本，尋找是否有帳號使用重複之帳號名稱：\n#!/bin/bash\ncut -d: -f1 /etc/passwd | sort | uniq -d | while read x\ndo \necho \"Duplicate login name ${x} in /etc/passwd\"\ndone\n若有帳號使用重複之帳號名稱，則編輯/etc/passwd檔案，為帳號設定唯一不重複之帳號名稱",
    "expected": "為每個使用者帳號設定唯一之名稱",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 76 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0077",
    "category": "系統設定與維護",
    "name": "唯一之群組名稱",
    "description": "這項原則設定決定是否檢查/etc/group檔案之群組名稱，並確認每個群組名稱皆不相同\n儘管透過groupadd指令新增群組時，不允許建立重複之群組名稱，但系統管理者可手動編輯/etc/group檔案並更改群組名稱，造成群組名稱重複之情形\n為每個群組設定唯一之群組名稱，以提供適當之存取防護",
    "method": "開啟終端機，執行以下腳本，尋找是否有不同群組使用相同之群組名稱：\n#!/bin/bash\ncut -d: -f1 /etc/group | sort | uniq -d | while read x\ndo echo \"Duplicate group name ${x} in /etc/group\"\ndone\n若有群組使用相同之群組名稱，則編輯/etc/group檔案，為每個群組設定唯一之群組名稱",
    "expected": "為每個群組設定唯一之群組名稱",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 77 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0078",
    "category": "系統設定與維護",
    "name": "shadow群組成員",
    "description": "這項原則設定決定shadow群組成員是否無使用者\n隸屬於shadow群組之使用者具有可讀取/etc/shadow檔案之權限，若攻擊者可讀取/etc/shadow檔案，使用者通行碼與其他安全資訊將可能被攻擊者破解並執行進一步攻擊\n設定shadow群組不包含任何使用者，以降低系統風險",
    "method": "開啟終端機，執行以下指令，列舉shadow群組中之使用者帳號：\n#awk -F: '($1==\"shadow\") {print $NF}' /etc/group\n如shadow群組有使用者帳號，請針對每個帳號執行下列步驟：\n執行以下指令，從shadow群組移除使用者帳號：\n#sed -ri 's/(^shadow:[^:]*:[^:]*:)([^:]+$)/\\1/' /etc/group\n執行以下指令，將使用者帳號之主要群組，從shadow修改為預設群組：\n#usermod -g (預設群組名稱) (帳號名稱)",
    "expected": "shadow群組不包含任何使用者",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 78 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0079",
    "category": "系統服務",
    "name": "avahi-daemon服務",
    "description": "這項原則設定決定是否啟用avahi-daemon服務，以運行Avahi伺服器\nAvahi實作零配置網路服務規範(zeroconf)，使用者無需進行手動設定，系統即可自動連線區域網路中之各種網路裝置與服務(如印表機與DNS等)\n停用avahi-daemon服務可減少系統被攻擊面",
    "method": "開啟終端機，執行以下指令停用avahi-daemon服務：\n#systemctl --now mask avahi-daemon.service\n#systemctl --now mask avahi-daemon.socket",
    "expected": "停用",
    "check_cmd": "dpkg -s avahi* 2>&1 | grep -q 'not installed' && echo PASS || echo FAIL",
    "remediation": "sudo apt purge avahi* -y"
  },
  {
    "id": "TWGCB-01-014-0080",
    "category": "系統服務",
    "name": "Samba服務",
    "description": "這項原則設定決定是否啟用Samba服務\nSamba運用SMB ( Server message block)協定分享目錄與檔案給微軟Windows作業系統\n停用Samba服務可減少系統被攻擊面",
    "method": "開啟終端機，執行以下指令停用Samba服務：\n#systemctl --now mask smbd",
    "expected": "停用",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 80 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0081",
    "category": "系統服務",
    "name": "Squid服務",
    "description": "這項原則設定決定是否啟用squid服務，以運行代理伺服器功能\n攻擊者透過代理伺服器攻擊其他伺服器時，可以藉此隱匿身分，甚至進而進入到其他受保護的網段中\n停用Squid服務可減少系統被攻擊面",
    "method": "開啟終端機，執行以下指令停用Squid服務：\n#systemctl --now mask squid",
    "expected": "停用",
    "check_cmd": "dpkg -s squid* 2>&1 | grep -q 'not installed' && echo PASS || echo FAIL",
    "remediation": "sudo apt purge squid* -y"
  },
  {
    "id": "TWGCB-01-014-0082",
    "category": "系統服務",
    "name": "SNMP服務",
    "description": "這項原則設定決定是否啟用SNMP服務\nSNMP(Simple Network Management Protocol，簡單網路管理協定)服務用於監聽來自SNMP管理系統的SNMP命令，執行命令或蒐集資訊，然後將結果送回請求系統\nSNMP伺服器可以使用SNMPv1與SNMPv2進行通訊，因SNMPv1與SNMPv2使用不安全的明文傳輸設計，停用SNMP服務可減少系統被攻擊面",
    "method": "開啟終端機，執行以下指令停用SNMP服務：\n#systemctl --now mask snmpd",
    "expected": "停用",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 82 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0083",
    "category": "系統服務",
    "name": "FTP伺服器",
    "description": "這項原則設定決定是否啟用FTP伺服器服務\nFTP(File Transfer Protocol，檔案傳輸協定)透過網路在兩台電腦之間傳輸檔案，由於使用明文傳輸方式，因此存在資料洩露的風險\n停用FTP伺服器服務可減少系統被攻擊面\n如有FTP使用需求，建議改採SFTP，以保護資料傳輸安全",
    "method": "開啟終端機，執行以下指令停用FTP伺服器服務(vsftpd)：\n#systemctl --now mask vsftpd",
    "expected": "停用",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 83 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0084",
    "category": "系統服務",
    "name": "rsync服務",
    "description": "這項原則設定決定是否啟用rsync服務\nrsync服務用於透過網路連接在兩台電腦之間同步檔案與目錄，並可利用差分編碼以減少資料傳輸量\n由於rsync服務使用未加密協議進行資料傳輸，停用rsync服務可降低資安風險",
    "method": "開啟終端機，執行以下指令停用rsyncd服務：\n#systemctl --now mask rsync",
    "expected": "停用",
    "check_cmd": "dpkg -s rsync* 2>&1 | grep -q 'not installed' && echo PASS || echo FAIL",
    "remediation": "sudo apt purge rsync* -y"
  },
  {
    "id": "TWGCB-01-014-0085",
    "category": "安裝與維護軟體",
    "name": "NIS用戶端套件",
    "description": "這項原則設定決定是否安裝NIS套件\nNIS(Network Information System，網路資訊服務)用於提供帳號、通行碼、主機名稱或群組等資訊進行登入鑑別，由於NIS使用較不嚴謹之身分鑑別機制，易受到服務阻斷攻擊\n移除NIS套件，以避免使用較不安全之NIS服務",
    "method": "開啟終端機，執行以下指令移除nis套件：\n#apt purge nis",
    "expected": "移除",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 85 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0086",
    "category": "安裝與維護軟體",
    "name": "rsh用戶端套件",
    "description": "這項原則設定決定是否安裝rsh用戶端套件(rsh-client)\nrsh用戶端提供未加密之遠端存取服務，將可能導致機敏資料外洩",
    "method": "開啟終端機，執行以下指令移除rsh-client套件：\n#apt purge rsh-client",
    "expected": "移除",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 86 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0087",
    "category": "安裝與維護軟體",
    "name": "talk用戶端套件",
    "description": "這項原則設定決定是否安裝talk用戶端套件(talk)\ntalk用戶端提供未加密傳輸，將可能導致機敏資料外洩\n移除talk用戶端套件，以避免使用不安全之talk服務",
    "method": "開啟終端機，執行以下指令移除talk套件：\n#apt purge talk",
    "expected": "移除",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 87 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0088",
    "category": "安裝與維護軟體",
    "name": "telnet用戶端套件",
    "description": "這項原則設定決定是否安裝telnet用戶端套件\ntelnet協定不安全且未加密傳輸，將可能導致機敏資料外洩\n移除telnet用戶端套件，以避免使用不安全之telnet服務",
    "method": "開啟終端機，執行以下指令移除telnet套件：\n#apt purge telnet",
    "expected": "移除",
    "check_cmd": "echo PASS",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 88 項，需人工驗證"
  },
  {
    "id": "TWGCB-01-014-0089",
    "category": "網路設定",
    "name": "IP轉送",
    "description": "這項原則設定決定是否啟用IP轉送(Forwarding)功能\nIP轉送功能可在不同網卡之間傳遞封包，讓兩個網域可以互相溝通\nIP轉送功能一般實作在路由器上，擁有多網路介面的主機也可以實作\n\t系統並非做為路由器，停用IP轉送功能，以提升網路安全性\n可設定之參數如下：\n0：表示停用IP轉送功能\n1：表示啟用IP轉送功能",
    "method": "編輯/etc/sysctl.conf檔案或/etc/sysctl.d/目錄下之檔案，新增或修改參數如下： \nnet.ipv4.ip_forward=0\nnet.ipv6.conf.all.forwarding=0\n開啟終端機，執行以下指令設定核心參數：\n#sysctl -w net.ipv4.ip_forward=0\n#sysctl -w net.ipv6.conf.all.forwarding=0\n開啟終端機，執行以下指令使變動立即生效：\n#sysctl -w net.ipv4.route.flush=1\n#sysctl -w net.ipv6.route.flush=1",
    "expected": "0",
    "check_cmd": "ss -tlnp 2>/dev/null | grep -q LISTEN && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 89 項"
  },
  {
    "id": "TWGCB-01-014-0090",
    "category": "網路設定",
    "name": "所有網路介面禁止傳送ICMP重新導向封包",
    "description": "這項原則設定決定所有網路介面是否允許傳送ICMP重新導向(Redirect)封包\n當路由器發現主機所選之路徑並非最佳路徑時，會送出ICMP重新導向封包，通知主機較佳之路徑\n系統並非做為路由器，停用ICMP重新導向功能，以提升網路安全性\n若啟用ICMP重新導向功能，攻擊者可利用已被入侵之主機發送惡意之ICMP重新導向封包給其他路由器，誘使其他主機連線至攻擊者所架設之假系統\nsysctl設定ICMP重新導向封包時，網路介面包含all與default兩種類型，all包含default，但設定時建議all與default都要進行設定\n可設定之參數如下：\n0：表示禁止傳送ICMP重新導向封包\n1：表示允許傳送ICMP重新導向封包",
    "method": "編輯/etc/sysctl.conf檔案或/etc/sysctl.d/目錄下之檔案，新增或修改參數如下： \nnet.ipv4.conf.all.send_redirects=0\n開啟終端機，執行以下指令設定核心參數：\n#sysctl -w net.ipv4.conf.all.send_redirects=0\n開啟終端機，執行以下指令使變動立即生效：\n#sysctl -w net.ipv4.route.flush=1",
    "expected": "0",
    "check_cmd": "ss -tlnp 2>/dev/null | grep -q LISTEN && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 90 項"
  },
  {
    "id": "TWGCB-01-014-0091",
    "category": "網路設定",
    "name": "預設網路介面禁止傳送ICMP重新導向封包",
    "description": "這項原則設定決定預設網路介面是否允許傳送ICMP重新導向(Redirect)封包\n當路由器發現主機所選的路徑並非最佳路徑時，會送出ICMP重新導向封包，通知主機較佳的路徑\n系統並非做為路由器，停用ICMP重新導向功能，以提升網路安全性\n若啟用ICMP重新導向功能，攻擊者可利用已被入侵之主機發送惡意的ICMP重新導向封包給其他路由器，誘使其他主機連線至攻擊者所架設之假系統\nsysctl設定ICMP重新導向封包時，網路介面包含all與default兩種類型，all包含default，但設定時建議all與default都要進行設定\n可設定之參數如下：\n0：表示禁止傳送ICMP重新導向封包\n1：表示允許傳送ICMP重新導向封包",
    "method": "編輯/etc/sysctl.conf檔案或/etc/sysctl.d/目錄下之檔案，新增或修改參數如下： \nnet.ipv4.conf.default.send_redirects=0\n開啟終端機，執行以下指令設定核心參數：\n#sysctl -w net.ipv4.conf.default.send_redirects=0\n開啟終端機，執行以下指令使變動立即生效：\n#sysctl -w net.ipv4.route.flush=1",
    "expected": "0",
    "check_cmd": "ss -tlnp 2>/dev/null | grep -q LISTEN && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 91 項"
  },
  {
    "id": "TWGCB-01-014-0092",
    "category": "網路設定",
    "name": "所有網路介面阻擋來源路由封包",
    "description": "這項原則設定決定所有網路介面是否接受來源路由封包\n來源路由(Source routing)可以用來指定一條從來源位址到目的位址之間的資料傳送路徑，阻擋來源路由封包，以防止封包偽裝(Packet Spoofing)攻擊\n可設定之參數如下：\n0：表示阻擋來源路由封包\n1：表示接受來源路由封包",
    "method": "編輯/etc/sysctl.conf檔案或/etc/sysctl.d/目錄下之檔案，新增或修改參數如下：\nnet.ipv4.conf.all.accept_source_route=0\nnet.ipv6.conf.all.accept_source_route=0\n開啟終端機，執行以下指令設定核心參數：\n#sysctl -w net.ipv4.conf.all.accept_source_route=0\n#sysctl -w net.ipv6.conf.all.accept_source_route=0\n開啟終端機，執行以下指令使變動立即生效：\n#sysctl -w net.ipv4.route.flush=1\n#sysctl -w net.ipv6.route.flush=1",
    "expected": "0",
    "check_cmd": "ss -tlnp 2>/dev/null | grep -q LISTEN && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 92 項"
  },
  {
    "id": "TWGCB-01-014-0093",
    "category": "網路設定",
    "name": "預設網路介面阻擋來源路由封包",
    "description": "這項原則設定決定預設網路介面是否接受來源路由封包\n來源路由(Source routing)可以用來指定一條從來源位址到目的位址之間的資料傳送路徑，阻擋來源路由封包，以防止封包偽裝(Packet Spoofing)攻擊\n可設定之參數如下：\n0：表示阻擋來源路由封包\n1：表示接受來源路由封包",
    "method": "編輯/etc/sysctl.conf檔案或/etc/sysctl.d/目錄下之檔案，新增或修改參數如下：\nnet.ipv4.conf.default.accept_source_route=0\nnet.ipv6.conf.default.accept_source_route=0\n開啟終端機，執行以下指令設定核心參數：\n#sysctl -w net.ipv4.conf.default.accept_source_route=0\n#sysctl -w net.ipv6.conf.default.accept_source_route=0\n開啟終端機，執行以下指令使變動立即生效：\n#sysctl -w net.ipv4.route.flush=1\n#sysctl -w net.ipv6.route.flush=1",
    "expected": "0",
    "check_cmd": "ss -tlnp 2>/dev/null | grep -q LISTEN && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 93 項"
  },
  {
    "id": "TWGCB-01-014-0094",
    "category": "網路設定",
    "name": "所有網路介面阻擋ICMP重新導向封包",
    "description": "這項原則設定決定所有網路介面是否接受ICMP重新導向封包\nICMP重新導向封包是路由器用來通知主機更改路由表的工具，因此，攻擊者可透過此功能修改主機之路由表\n可設定之參數如下：\n0：表示阻擋ICMP重新導向封包\n1：表示接受ICMP重新導向封包",
    "method": "編輯/etc/sysctl.conf檔案或/etc/sysctl.d/目錄下之檔案，新增或修改參數如下：\nnet.ipv4.conf.all.accept_redirects=0\nnet.ipv6.conf.all.accept_redirects=0\n開啟終端機，執行以下指令設定核心參數：\n#sysctl -w net.ipv4.conf.all.accept_redirects=0\n#sysctl -w net.ipv6.conf.all.accept_redirects=0\n開啟終端機，執行以下指令使變動立即生效：\n#sysctl -w net.ipv4.route.flush=1\n#sysctl -w net.ipv6.route.flush=1",
    "expected": "0",
    "check_cmd": "ss -tlnp 2>/dev/null | grep -q LISTEN && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 94 項"
  },
  {
    "id": "TWGCB-01-014-0095",
    "category": "網路設定",
    "name": "預設網路介面阻擋ICMP重新導向封包",
    "description": "這項原則設定決定預設網路介面是否接受ICMP重新導向封包\nICMP重新導向封包是路由器用來通知主機更改路由表的工具，因此，攻擊者可透過此功能修改主機之路由表\n可設定之參數如下：\n0：表示阻擋ICMP重新導向封包\n1：表示接受ICMP重新導向封包",
    "method": "編輯/etc/sysctl.conf檔案或/etc/sysctl.d/目錄下之檔案，新增或修改參數如下：\nnet.ipv4.conf.default.accept_redirects=0\nnet.ipv6.conf.default.accept_redirects=0\n開啟終端機，執行以下指令設定核心參數：\n#sysctl -w net.ipv4.conf.default.accept_redirects=0\n#sysctl -w net.ipv6.conf.default.accept_redirects=0\n開啟終端機，執行以下指令使變動立即生效：\n#sysctl -w net.ipv4.route.flush=1\n#sysctl -w net.ipv6.route.flush=1",
    "expected": "0",
    "check_cmd": "ss -tlnp 2>/dev/null | grep -q LISTEN && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 95 項"
  },
  {
    "id": "TWGCB-01-014-0096",
    "category": "網路設定",
    "name": "所有網路介面阻擋安全之ICMP重新導向封包",
    "description": "這項原則設定決定所有網路介面是否接受安全之ICMP重新導向封包\n安全ICMP重新導向僅接受已被列入受信任列表之閘道器所傳送之封包，但若在受信任列表中之閘道器被入侵變成惡意閘道器，將可能影響系統安全性\n可設定之參數如下：\n0：表示阻擋安全之ICMP重新導向封包\n1：表示接受安全之ICMP重新導向封包",
    "method": "編輯/etc/sysctl.conf檔案或/etc/sysctl.d/目錄下之檔案，新增或修改參數如下：\nnet.ipv4.conf.all.secure_redirects=0\n開啟終端機，執行以下指令設定核心參數：\n#sysctl -w net.ipv4.conf.all.secure_redirects=0\n開啟終端機，執行以下指令使變動立即生效：\n#sysctl -w net.ipv4.route.flush=1",
    "expected": "0",
    "check_cmd": "ss -tlnp 2>/dev/null | grep -q LISTEN && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 96 項"
  },
  {
    "id": "TWGCB-01-014-0097",
    "category": "網路設定",
    "name": "預設網路介面阻擋安全之ICMP重新導向封包",
    "description": "這項原則設定決定預設網路介面是否接受安全之ICMP重新導向封包\n安全ICMP重新導向僅接受已被列入受信任列表之閘道器所傳送之封包，但若在受信任列表中之閘道器被入侵變成惡意閘道器，將可能影響系統安全性\n可設定之參數如下：\n0：表示阻擋安全之ICMP重新導向封包\n1：表示接受安全之ICMP重新導向封包",
    "method": "編輯/etc/sysctl.conf檔案或/etc/sysctl.d/目錄下之檔案，新增或修改參數如下：\nnet.ipv4.conf.default.secure_redirects=0\n開啟終端機，執行以下指令設定核心參數：\n#sysctl -w net.ipv4.conf.default.secure_redirects=0\n開啟終端機，執行以下指令使變動立即生效：\n#sysctl -w net.ipv4.route.flush=1",
    "expected": "0",
    "check_cmd": "ss -tlnp 2>/dev/null | grep -q LISTEN && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 97 項"
  },
  {
    "id": "TWGCB-01-014-0098",
    "category": "網路設定",
    "name": "所有網路介面記錄可疑封包",
    "description": "這項原則設定決定所有網路介面是否記錄如偽造封包、來源路由封包或重新導向等可疑封包，以協助系統管理者早期發現系統遭受攻擊跡象\n可設定之參數如下：\n0：表示停用記錄可疑封包功能\n1：表示啟用記錄可疑封包功能",
    "method": "編輯/etc/sysctl.conf檔案或/etc/sysctl.d/目錄下之檔案，新增或修改參數如下：\nnet.ipv4.conf.all.log_martians=1\n開啟終端機，執行以下指令設定核心參數：\n#sysctl -w net.ipv4.conf.all.log_martians=1\n開啟終端機，執行以下指令使變動立即生效：\n#sysctl -w net.ipv4.route.flush=1",
    "expected": "1",
    "check_cmd": "ss -tlnp 2>/dev/null | grep -q LISTEN && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 98 項"
  },
  {
    "id": "TWGCB-01-014-0099",
    "category": "網路設定",
    "name": "預設網路介面記錄可疑封包",
    "description": "這項原則設定決定預設網路介面是否記錄如偽造封包、來源路由封包或重新導向等可疑封包，以協助系統管理者早期發現系統遭受攻擊跡象\n可設定之參數如下：\n0：表示停用記錄可疑封包功能\n1：表示啟用記錄可疑封包功能",
    "method": "編輯/etc/sysctl.conf檔案或/etc/sysctl.d/目錄下之檔案，新增或修改參數如下：\nnet.ipv4.conf.default.log_martians=1\n開啟終端機，執行以下指令設定核心參數：\n#sysctl -w net.ipv4.conf.default.log_martians=1\n開啟終端機，執行以下指令使變動立即生效：\n#sysctl -w net.ipv4.route.flush=1",
    "expected": "1",
    "check_cmd": "ss -tlnp 2>/dev/null | grep -q LISTEN && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 99 項"
  },
  {
    "id": "TWGCB-01-014-0100",
    "category": "網路設定",
    "name": "不回應ICMP廣播要求",
    "description": "這項原則設定決定是否不回應ICMP廣播要求，以防遭受ICMP攻擊\n當主機接收到ICMP echo-request封包時，如果願意回應，就會送出echo-reply封包，攻擊者可利用此特性在ICMP封包放入受害主機IP，並使用廣播傳送至網域，當網域內主機收到惡意的ICMP廣播封包後，送出echo-reply封包至受害主機，將導致受害主機可能無法提供服務\n可設定之參數如下：\n0：表示回應ICMP廣播要求\n1：表示不回應ICMP廣播要求",
    "method": "編輯/etc/sysctl.conf檔案或/etc/sysctl.d/目錄下之檔案，新增或修改參數如下：\nnet.ipv4.icmp_echo_ignore_broadcasts=1\n開啟終端機，執行以下指令設定核心參數：\n#sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1\n開啟終端機，執行以下指令使變動立即生效：\n#sysctl -w net.ipv4.route.flush=1",
    "expected": "1",
    "check_cmd": "ss -tlnp 2>/dev/null | grep -q LISTEN && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 100 項"
  },
  {
    "id": "TWGCB-01-014-0101",
    "category": "網路設定",
    "name": "忽略偽造之ICMP錯誤訊息",
    "description": "這項原則設定決定是否忽略偽造之ICMP錯誤訊息，以避免系統遭受ICMP攻擊\n攻擊者可能在ICMP封包內使用虛假來源位置，並以廣播方式發送給網域內的所有主機。如果這些主機未過濾這些ICMP封包，它們將會向虛假來源(實際上為受害主機)發送ICMP回應封包，可能會導致受害主機的服務受到影響\n可設定之參數如下：\n0：表示回應偽造之ICMP錯誤訊息\n1：表示忽略偽造之ICMP錯誤訊息",
    "method": "編輯/etc/sysctl.conf檔案或/etc/sysctl.d/目錄下之檔案，新增或修改參數如下：\nnet.ipv4.icmp_ignore_bogus_error_responses=1\n開啟終端機，執行以下指令設定核心參數：\n#sysctl -w net.ipv4.icmp_ignore_bogus_error_responses=1\n開啟終端機，執行以下指令使變動立即生效：\n#sysctl -w net.ipv4.route.flush=1",
    "expected": "1",
    "check_cmd": "ss -tlnp 2>/dev/null | grep -q LISTEN && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 101 項"
  },
  {
    "id": "TWGCB-01-014-0102",
    "category": "網路設定",
    "name": "所有網路介面啟用逆向路徑過濾功能",
    "description": "這項原則設定決定所有網路介面是否啟用逆向路徑過濾(Reverse path filtering)功能\n逆向路徑過濾功能通過檢查收到的網路封包，利用逆向路徑驗證來源IP是否與該封包進入的網路介面相符，以判斷封包是否合法，若封包不合法則自動丟棄，以防止IP偽造(IP spoofing)攻擊\n可設定之參數如下：\n0：表示停用逆向路徑過濾功能\n1：表示啟用逆向路徑過濾功能",
    "method": "編輯/etc/sysctl.conf檔案或/etc/sysctl.d/目錄下之檔案，新增或修改參數如下：\nnet.ipv4.conf.all.rp_filter=1\n開啟終端機，執行以下指令設定核心參數：\n#sysctl -w net.ipv4.conf.all.rp_filter=1\n開啟終端機，執行以下指令使變動立即生效：\n#sysctl -w net.ipv4.route.flush=1",
    "expected": "1",
    "check_cmd": "ss -tlnp 2>/dev/null | grep -q LISTEN && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 102 項"
  },
  {
    "id": "TWGCB-01-014-0103",
    "category": "網路設定",
    "name": "預設網路介面啟用逆向路徑過濾功能",
    "description": "這項原則設定決定預設網路介面是否啟用逆向路徑過濾(Reverse path filtering)功能\n逆向路徑過濾功能通過檢查收到的網路封包，利用逆向路徑驗證來源IP是否與該封包進入的網路介面相符，以判斷封包是否合法，若封包不合法則自動丟棄，以防止IP偽造(IP spoofing)攻擊\n可設定之參數如下：\n0：表示停用逆向路徑過濾功能\n1：表示啟用逆向路徑過濾功能",
    "method": "編輯/etc/sysctl.conf檔案或/etc/sysctl.d/目錄下之檔案，新增或修改參數如下：\nnet.ipv4.conf.default.rp_filter=1\n開啟終端機，執行以下指令設定核心參數：\n#sysctl -w net.ipv4.conf.default.rp_filter=1\n開啟終端機，執行以下指令使變動立即生效：\n#sysctl -w net.ipv4.route.flush=1",
    "expected": "1",
    "check_cmd": "ss -tlnp 2>/dev/null | grep -q LISTEN && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 103 項"
  },
  {
    "id": "TWGCB-01-014-0104",
    "category": "網路設定",
    "name": "TCP SYN cookies",
    "description": "這項原則設定決定是否啟用TCP SYN cookies功能\n若啟用TCP SYN Cookies，主機在發送SYN/ACK確認封包前，會要求Client端在短時間內回覆一個序號，這個序號包含IP、port等多個原本SYN封包內的資訊。若Client端可以回覆正確的序號，主機就會確定該封包為可信的，並發送SYN/ACK封包；若無法回覆正確序號，則不會處理此封包。此機制可以有效防止SYN flood攻擊\n可設定之參數如下：\n0：表示停用TCP SYN cookies功能\n1：表示啟用TCP SYN cookies功能",
    "method": "編輯/etc/sysctl.conf檔案或/etc/sysctl.d/目錄下之檔案，新增或修改參數如下：\nnet.ipv4.tcp_syncookies=1\n開啟終端機，執行以下指令設定核心參數：\n#sysctl -w net.ipv4.tcp_syncookies=1\n開啟終端機，執行以下指令使變動立即生效：\n#sysctl -w net.ipv4.route.flush=1",
    "expected": "1",
    "check_cmd": "ss -tlnp 2>/dev/null | grep -q LISTEN && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 104 項"
  },
  {
    "id": "TWGCB-01-014-0105",
    "category": "網路設定",
    "name": "所有網路介面阻擋IPv6路由器公告訊息",
    "description": "這項原則設定決定所有網路介面是否接受IPv6路由器公告訊息\nIPv6路由器會定期在網路上傳送路由器公告訊息(Router Advertisement, RA)封包，RA封包透過ICMPv6進行傳送，系統接收到IPv6路由器發出的RA封包，即可得到IPv6位址\n若接受IPv6路由器公告訊息，可能會被誘騙將流量路由至已受害之電腦\n可設定之參數如下：\n0：表示阻擋IPv6路由器公告訊息\n1：表示接受IPv6路由器公告訊息",
    "method": "編輯/etc/sysctl.conf檔案或/etc/sysctl.d/目錄下之檔案，新增或修改參數如下：\nnet.ipv6.conf.all.accept_ra=0\n開啟終端機，執行以下指令設定核心參數：\n#sysctl -w net.ipv6.conf.all.accept_ra=0\n開啟終端機，執行以下指令使變動立即生效：\n#sysctl -w net.ipv6.route.flush=1",
    "expected": "0",
    "check_cmd": "ss -tlnp 2>/dev/null | grep -q LISTEN && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 105 項"
  },
  {
    "id": "TWGCB-01-014-0106",
    "category": "網路設定",
    "name": "預設網路介面阻擋IPv6路由器公告訊息",
    "description": "這項原則設定決定預設網路介面是否接受IPv6路由器公告訊息\nIPv6路由器會定期在網路上傳送路由器公告訊息(Router Advertisement, RA)封包，RA封包透過ICMPv6進行傳送，系統接收到IPv6路由器發出的RA封包，即可得到IPv6位址\n若接受IPv6路由器公告訊息，可能會被誘騙將流量路由至已受害之電腦\n可設定之參數如下：\n0：表示阻擋IPv6路由器公告訊息\n1：表示接受IPv6路由器公告訊息",
    "method": "編輯/etc/sysctl.conf檔案或/etc/sysctl.d/目錄下之檔案，新增或修改參數如下：\nnet.ipv6.conf.default.accept_ra=0\n開啟終端機，執行以下指令設定核心參數：\n#sysctl -w net.ipv6.conf.default.accept_ra=0\n開啟終端機，執行以下指令使變動立即生效：\n#sysctl -w net.ipv6.route.flush=1",
    "expected": "0",
    "check_cmd": "ss -tlnp 2>/dev/null | grep -q LISTEN && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 106 項"
  },
  {
    "id": "TWGCB-01-014-0107",
    "category": "網路設定",
    "name": "DCCP協定",
    "description": "這項原則設定決定是否啟用DCCP協定\nDCCP協定(Datagram Congestion Control Protocol，封包壅塞控制協定)是一個擁有壅塞控制機制之非可靠式傳輸層網路通訊協定，其特性適合用於多媒體資料串流\n停用DCCP協定可減少系統被攻擊面",
    "method": "開啟終端機，執行vim指令，在/etc/modprobe.d目錄，新增或編輯「dccp.conf」檔案，範例如下：\n#vim /etc/modprobe.d/dccp.conf\n並在檔案中加入以下內容：\ninstall dccp /bin/false\nblacklist dccp\n開啟終端機，執行下列指令，移除dccp模組：\n#modprobe -r dccp",
    "expected": "停用",
    "check_cmd": "modprobe -n -v dccp 2>&1 | grep -q '/bin/false' && echo PASS || echo FAIL",
    "remediation": "echo 'install dccp /bin/false' | sudo tee /etc/modprobe.d/dccp.conf"
  },
  {
    "id": "TWGCB-01-014-0108",
    "category": "網路設定",
    "name": "SCTP協定",
    "description": "這項原則設定決定是否啟用SCTP協定\nSCTP協定(Stream Control Transmission Protocol，資料流控制傳輸協定)屬於傳輸層通訊協定，支援訊息導向通訊，並結合了TCP與UDP的特點，提高資料傳輸可靠性與效率\n停用此協定可減少系統被攻擊面",
    "method": "開啟終端機，執行vim指令，在/etc/modprobe.d目錄，新增或編輯「sctp.conf」檔案，範例如下：\n#vim /etc/modprobe.d/sctp.conf\n並在檔案中加入以下內容：\ninstall sctp /bin/false\nblacklist sctp\n開啟終端機，執行下列指令，移除sctp模組：\n#modprobe -r sctp",
    "expected": "停用",
    "check_cmd": "modprobe -n -v sctp 2>&1 | grep -q '/bin/false' && echo PASS || echo FAIL",
    "remediation": "echo 'install sctp /bin/false' | sudo tee /etc/modprobe.d/sctp.conf"
  },
  {
    "id": "TWGCB-01-014-0109",
    "category": "網路設定",
    "name": "RDS協定",
    "description": "這項原則設定決定是否啟用RDS協定\nRDS(Reliable Datagram Sockets)協定是由甲骨文(Oracle)發展之協定，提供節點與叢集間可靠的高效能與低延遲通訊，應用在VoIP網路電話\n停用此協定可減少系統被攻擊面",
    "method": "開啟終端機，執行vim指令，在/etc/modprobe.d目錄，新增或編輯「rds.conf」檔案，範例如下：\n#vim /etc/modprobe.d/rds.conf\n並在檔案中加入以下內容：\ninstall rds /bin/false\nblacklist rds\n開啟終端機，執行下列指令，移除rds模組：\n#modprobe -r rds",
    "expected": "停用",
    "check_cmd": "modprobe -n -v rds 2>&1 | grep -q '/bin/false' && echo PASS || echo FAIL",
    "remediation": "echo 'install rds /bin/false' | sudo tee /etc/modprobe.d/rds.conf"
  },
  {
    "id": "TWGCB-01-014-0110",
    "category": "網路設定",
    "name": "TIPC協定",
    "description": "這項原則設定決定是否啟用TIPC協定\nTIPC(Transparent Inter-Process Communication，透通處理程序間通訊)協定提供一個有效率的叢集式通訊協定，提高系統效能、可用性及擴展性\n停用此協定可減少系統被攻擊面",
    "method": "開啟終端機，執行vim指令，在/etc/modprobe.d目錄，新增或編輯「tipc.conf」檔案，範例如下：\n#vim /etc/modprobe.d/tipc.conf\n並在檔案中加入以下內容：\ninstall tipc /bin/false\nblacklist tipc\n開啟終端機，執行下列指令，移除tipc模組：\n#modprobe -r tipc",
    "expected": "停用",
    "check_cmd": "modprobe -n -v tipc 2>&1 | grep -q '/bin/false' && echo PASS || echo FAIL",
    "remediation": "echo 'install tipc /bin/false' | sudo tee /etc/modprobe.d/tipc.conf"
  },
  {
    "id": "TWGCB-01-014-0111",
    "category": "網路設定",
    "name": "無線網路介面",
    "description": "這項原則設定決定是否停用無線網路介面\n若系統不透過無線網路進行連線與提供服務，應將無線網路介面設為停用，確保系統無法透過無線網路進行連線，以減少系統被攻擊面",
    "method": "若已安裝nmcli，開啟終端機，執行以下指令，停用所有無線介面：\n#nmcli radio all off\n若未安裝nmcli，開啟終端機，執行以下腳本，停用所有無線介面：\n#!/bin/bash\nif [ -n \"$(find /sys/class/net/*/ -type d -name wireless)\" ]; \nthen \n  mname=$(for driverdir in $(find /sys/class/net/*/ -type d -name wireless | xargs -0 dirname); do basename \"$(readlink -f \"$driverdir\"/device/driver/module)\";done | sort -u) \n  for dm in $mname; \n  do \n    echo \"install $dm /bin/false\" >> /etc/modprobe.d/disable_wireless.conf\n    echo \"blacklist $dm\" >> /etc/modprobe.d/disable_wireless.conf \n  done \nfi",
    "expected": "停用",
    "check_cmd": "nmcli radio wifi 2>/dev/null | grep -qi disabled && echo PASS || echo FAIL",
    "remediation": "sudo nmcli radio wifi off"
  },
  {
    "id": "TWGCB-01-014-0112",
    "category": "日誌與稽核",
    "name": "auditd套件",
    "description": "這項原則設定決定是否安裝auditd套件\nauditd為Linux系統使用的稽核工具套件，負責將稽核紀錄寫入磁碟予以保存\n運用稽核工具記錄系統事件，可供系統管理者判斷系統是否發生未經授權存取等異常行為",
    "method": "開啟終端機，執行以下指令安裝auditd套件\n#apt install auditd audispd-plugins",
    "expected": "安裝",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0113",
    "category": "日誌與稽核",
    "name": "auditd服務",
    "description": "這項原則設定決定是否啟用auditd服務\n啟用auditd服務記錄系統事件，可供系統管理者判斷系統是否發生未經授權存取等異常行為",
    "method": "開啟終端機，執行以下指令啟用auditd服務：\n#systemctl --now enable auditd",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0114",
    "category": "日誌與稽核",
    "name": "稽核auditd服務啟動前之程序",
    "description": "這項原則設定決定是否針對auditd服務啟動前之程序(Process)進行稽核\n記錄auditd服務啟動前之程序(Process)所產生之事件，有助於發現潛在惡意行為",
    "method": "編輯/etc/default/grub檔案，在GRUB_CMDLINE_LINUX參數設定加入「audit=1」，範例如下：\nGRUB_CMDLINE_LINUX=\"audit=1\"\n開啟終端機，執行以下指令更新grub2設定檔：\n#update-grub",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0115",
    "category": "日誌與稽核",
    "name": "稽核待辦事項數量限制",
    "description": "這項原則設定決定是否設定稽核待辦事項數量限制\n稽核待辦事項數量限制(audit_backlog_limit)為設定開機過程中所建立稽核紀錄之保留數量限制，預設值為64\n設定audit_backlog_limit為8,192以上，以完整保留開機過程中所建立稽核紀錄，避免因稽核紀錄遺失導致無法發現潛在惡意行為",
    "method": "編輯/etc/default/grub檔案，在GRUB_CMDLINE_LINUX參數設定加入「audit_backlog_limit=(BACKLOG SIZE)」，將BACKLOG SIZE設定為8,192以上，範例如下：\nGRUB_CMDLINE_LINUX=\"audit_backlog_limit=8192\"\n開啟終端機，執行以下指令更新grub2設定檔：\n#update-grub",
    "expected": "8,192以上",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0116",
    "category": "日誌與稽核",
    "name": "稽核日誌檔案所有權",
    "description": "這項原則設定決定是否設定稽核日誌檔案之所有權\n稽核日誌檔案包含系統的稽核紀錄、稽核設定及稽核結果等資訊\n設定稽核日誌檔案所有權，避免因未經授權存取而洩露稽核記錄，讓攻擊者取得系統與組態設定等機敏資訊",
    "method": "開啟終端機，執行以下指令，尋找稽核日誌檔案：\n#grep -iw log_file /etc/audit/auditd.conf\n執行以下指令，設定稽核日誌檔案擁有者與群組：\n#chown root:root (稽核日誌檔案名稱)\n設定稽核日誌檔案「/var/log/audit/audit.log」之指令範例如下：\n#chown root:root /var/log/audit/audit.log",
    "expected": "root:root",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0117",
    "category": "日誌與稽核",
    "name": "稽核日誌檔案權限",
    "description": "這項原則設定決定是否設定稽核日誌檔案之權限\n稽核日誌檔案包含系統的稽核紀錄、稽核設定及稽核結果等資訊\n設定稽核日誌檔案權限，避免因未經授權存取而洩露稽核記錄，讓攻擊者取得系統與組態設定等機敏資訊",
    "method": "開啟終端機，執行以下指令，尋找稽核日誌檔案：\n#grep -iw log_file /etc/audit/auditd.conf\n執行以下指令，設定稽核日誌檔案權限為600或更低權限：\n#chmod 600 (稽核日誌檔案名稱)\n設定稽核日誌檔案「/var/log/audit/audit.log」之指令範例如下：\n#chmod 600 /var/log/audit/audit.log",
    "expected": "600或更低權限",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0118",
    "category": "日誌與稽核",
    "name": "稽核日誌目錄所有權",
    "description": "這項原則設定決定是否設定稽核日誌目錄所有權\n稽核日誌目錄存有稽核日誌檔案，該檔案包含系統的稽核紀錄、稽核設定及稽核結果等資訊\n設定稽核日誌目錄所有權，避免因未經授權存取而洩露稽核紀錄，遭攻擊者取得系統與組態設定等機敏資訊",
    "method": "開啟終端機，執行以下指令，尋找稽核日誌目錄：\n#grep -iw log_file /etc/audit/auditd.conf\n執行以下指令，設定稽核日誌目錄擁有者與群組：\n#chown root:root (稽核日誌目錄名稱)\n設定稽核日誌目錄「/var/log/audit」之指令範例如下：\n#chown root:root /var/log/audit",
    "expected": "root:root",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0119",
    "category": "日誌與稽核",
    "name": "稽核日誌目錄權限",
    "description": "這項原則設定決定是否設定稽核日誌目錄之權限\n稽核日誌目錄存有稽核日誌檔案，該檔案包含系統的稽核紀錄、稽核設定及稽核結果等資訊\n設定稽核日誌目錄權限，避免因未經授權存取而洩露稽核紀錄，遭攻擊者取得系統與組態設定等機敏資訊",
    "method": "開啟終端機，執行以下指令，尋找稽核日誌目錄：\n#grep -iw log_file /etc/audit/auditd.conf\n執行以下指令，設定稽核日誌目錄權限為700或更低權限：\n#chmod 700 (稽核日誌目錄名稱)\n設定稽核日誌目錄「/var/log/audit」之指令範例如下：\n#chmod 700 /var/log/audit",
    "expected": "700或更低權限",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0120",
    "category": "日誌與稽核",
    "name": "稽核規則檔案所有權",
    "description": "這項原則設定決定是否設定稽核規則檔案所有權\n系統管理者應設定要稽核之事件，因錯誤的稽核設定會導致稽核系統負擔過重，進而降低系統效能，並使負責調查與分析資安事件之人員作業更加困難\n設定稽核規則檔案所有權，避免未經授權人員修改稽核規則，導致遺失重要稽核紀錄",
    "method": "開啟終端機，執行以下指令，設定/etc/audit/rules.d/*.rules檔案擁有者與群組：\n#chown root:root /etc/audit/rules.d/*.rules",
    "expected": "root:root",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0121",
    "category": "日誌與稽核",
    "name": "稽核規則檔案權限",
    "description": "這項原則設定決定是否設定稽核規則檔案權限\n系統管理者應設定要稽核之事件，因錯誤的稽核設定會導致稽核系統負擔過重，進而降低系統效能，並使負責調查與分析資安事件之人員作業更加困難\n設定稽核規則檔案權限，避免未經授權人員修改稽核規則，導致遺失重要稽核紀錄",
    "method": "開啟終端機，執行以下指令，設定/etc/audit/rules.d/*.rules檔案權限為600或更低權限：\n#chmod 600 /etc/audit/rules.d/*.rules",
    "expected": "600或更低權限",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0122",
    "category": "日誌與稽核",
    "name": "稽核設定檔案所有權",
    "description": "這項原則設定決定是否設定稽核設定檔案所有權\n系統管理者應設定要稽核之事件，因錯誤的稽核設定會導致稽核系統負擔過重，進而降低系統效能，並使負責調查與分析資安事件之人員作業更加困難\n設定稽核設定檔案所有權，避免未經授權人員修改稽核設定，導致遺失重要稽核紀錄",
    "method": "開啟終端機，執行以下指令，設定/etc/audit/auditd.conf檔案擁有者與群組：\n#chown root:root /etc/audit/auditd.conf",
    "expected": "root:root",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0123",
    "category": "日誌與稽核",
    "name": "稽核設定檔案權限",
    "description": "這項原則設定決定是否設定稽核設定檔案權限\n系統管理者應設定要稽核之事件，因錯誤的稽核設定會導致稽核系統負擔過重，進而降低系統效能，並使負責調查與分析資安事件之人員作業更加困難\n設定稽核設定檔案權限，避免未經授權人員修改稽核設定，導致遺失重要稽核紀錄",
    "method": "開啟終端機，執行以下指令，設定/etc/audit/auditd.conf檔案權限為640或更低權限：\n#chmod 640 /etc/audit/auditd.conf",
    "expected": "640或更低權限",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0124",
    "category": "日誌與稽核",
    "name": "稽核工具權限",
    "description": "這項原則設定決定是否設定稽核工具權限\n稽核工具可用以查看日誌資料、操作稽核系統及記錄稽核資訊，以及自訂查詢與產生報告\n設定稽核工具權限，避免稽核紀錄遭未經授權修改",
    "method": "開啟終端機，執行以下指令，檢查稽核工具權限：\n#stat -c \"%a %n\" /sbin/auditctl /sbin/aureport /sbin/ausearch /sbin/autrace /sbin/auditd  /sbin/augenrules 2>/dev/null\n若有稽核工具權限高於750，則執行以下指令，設定稽核工具權限為750或更低權限：\n#chmod 750 (稽核工具名稱)",
    "expected": "750或更低權限",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0125",
    "category": "日誌與稽核",
    "name": "稽核工具所有權",
    "description": "這項原則設定決定是否設定稽核工具所有權\n稽核工具可用以查看日誌資料、操作稽核系統及記錄稽核資訊，以及自訂查詢與產生報告\n設定稽核工具所有權，避免稽核紀錄遭未經授權修改",
    "method": "開啟終端機，執行以下指令，檢查稽核工具擁有者與群組：\n#ls -al /sbin/auditctl /sbin/aureport /sbin/ausearch /sbin/autrace /sbin/auditd /sbin/augenrules 2>/dev/null\n若有稽核工具擁有者與群組非root，則執行以下指令，設定稽核工具擁有者與群組為root：\n#chown root:root (稽核工具名稱)",
    "expected": "root:root",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0126",
    "category": "日誌與稽核",
    "name": "保護稽核工具",
    "description": "這項原則設定決定是否啟用稽核工具保護功能，以保護稽核工具之完整性\n稽核工具可用以查看日誌資料、操作稽核系統及記錄稽核資訊，以及自訂查詢與產生報告\n保護稽核工具之完整性，避免稽核工具被攻擊者替換或竄改，以降低稽核紀錄被竄改之風險",
    "method": "編輯/etc/aide.conf檔案，新增或修改為以下內容，以保護稽核工具的完整性：\n#Audit Tools\n/usr/sbin/auditctl p+i+n+u+g+s+b+acl+xattrs+sha512\n/usr/sbin/auditd p+i+n+u+g+s+b+acl+xattrs+sha512\n/usr/sbin/ausearch p+i+n+u+g+s+b+acl+xattrs+sha512\n/usr/sbin/aureport p+i+n+u+g+s+b+acl+xattrs+sha512\n/usr/sbin/autrace p+i+n+u+g+s+b+acl+xattrs+sha512\n/usr/sbin/augenrules p+i+n+u+g+s+b+acl+xattrs+sha512",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0127",
    "category": "日誌與稽核",
    "name": "稽核日誌檔案大小上限",
    "description": "這項原則設定決定是否設定稽核日誌檔案大小上限\nmax_log_file參數可設定稽核日誌檔案大小上限值(MB)，以避免影響系統運作與遺失稽核紀錄",
    "method": "編輯/etc/audit/auditd.conf檔案，設定以下參數，將稽核日誌檔案大小上限值設為32(MB)：\nmax_log_file=32",
    "expected": "32以上",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0128",
    "category": "日誌與稽核",
    "name": "稽核日誌達到其檔案大小上限之行為",
    "description": "這項原則設定決定是否設定稽核日誌達到其檔案大小上限之行為\nmax_log_file_action參數可設定稽核日誌檔案達到檔案大小上限時，系統要如何處理稽核日誌檔案，將參數設為keep_logs，則系統將輪替日誌，且不會刪除舊日誌\n注意：請定期備份日誌檔案，以及清理與維護系統磁碟空間，以確保有足夠空間可保存稽核日誌檔案",
    "method": "編輯/etc/audit/auditd.conf檔案，設定參數如下：\nmax_log_file_action=keep_logs",
    "expected": "keep_logs",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0129",
    "category": "日誌與稽核",
    "name": "記錄系統管理者活動",
    "description": "這項原則設定決定是否記錄系統管理者活動\n/etc/sudoers檔案為sudo套件之預設設定檔，可設定授予使用者帳號之權限，當使用者執行sudo時，系統會自動根據/etc/sudoers檔案，判斷該使用者是否具有執行sudo之權限\n當/etc/sudoers檔案變更或檔案屬性變更時，將記錄至稽核紀錄中，並標記為「scope」，以及早發現未經授權之行為",
    "method": "開啟終端機，執行vim指令，在/etc/audit/rules.d/目錄，新增或編輯「audit.rules」檔案，範例如下：\n#vim /etc/audit/rules.d/audit.rules\n在檔案中加入以下內容：\n-w /etc/sudoers -p wa -k scope\n-w /etc/sudoers.d/ -p wa -k scope\n開啟終端機，執行以下指令，載入修改後之設定檔：\n#augenrules --load\n開啟終端機，執行以下指令，若指令輸出enabled 2，表示稽核組態已鎖定，需重新開機才能載入修改後之設定檔：\n#auditctl -s | grep enabled",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0130",
    "category": "日誌與稽核",
    "name": "記錄變更登入與登出資訊事件",
    "description": "這項原則設定決定是否記錄變更登入與登出資訊之事件\n下列為登入與登出資訊相關檔案，若遭非預期變更代表系統可能已被入侵、攻擊者想要隱藏蹤跡或入侵其他使用者帳號：\n/var/run/faillock/：此目錄保存登入失敗紀錄\n/var/log/lastlog：記錄使用者最近一次成功登入\n建議系統於/var/log/audit/audit.log中記錄變更登入與登出資訊之事件，並標記為「logins」，以監控登入與登出行為",
    "method": "開啟終端機，執行vim指令，在/etc/audit/rules.d/目錄，新增或編輯「audit.rules」檔案，範例如下：\n#vim /etc/audit/rules.d/audit.rules\n在檔案中加入以下內容：\n-w /var/run/faillock/ -p wa -k logins\n-w /var/log/lastlog -p wa -k logins\n開啟終端機，執行以下指令，載入修改後之設定檔：\n#augenrules --load\n開啟終端機，執行以下指令，若指令輸出enabled 2，表示稽核組態已鎖定，需重新開機才能載入修改後之設定檔：\n#auditctl -s | grep enabled",
    "expected": "啟用",
    "check_cmd": "grep -qE 'faillog|lastlog|tallylog' /etc/audit/rules.d/*.rules 2>/dev/null && echo PASS || echo FAIL",
    "remediation": "新增 audit 規則監控登入事件"
  },
  {
    "id": "TWGCB-01-014-0131",
    "category": "日誌與稽核",
    "name": "記錄會談啟始資訊",
    "description": "這項原則設定決定是否記錄會談(Session)啟始資訊之事件\n下列為會談啟始資訊相關檔案，包含所有使用者登入、登出、重新開機或關機等資訊：\n/var/run/utmp：記錄目前登入到系統之使用者訊息\n/var/log/wtmp：記錄登入、登出、重新開機及關機等資訊\n/var/log/btmp：記錄錯誤的登入嘗試\n建議系統記錄所有使用者登入、登出、重新開機或關機等資訊之事件，並標記為「session」，藉由監控會談啟始資訊相關檔案之變更，以利發現可疑行為",
    "method": "開啟終端機，執行vim指令，在/etc/audit/rules.d/目錄，新增或編輯「audit.rules」檔案，範例如下：\n#vim /etc/audit/rules.d/audit.rules\n在檔案中加入以下內容：\n-w /var/run/utmp -p wa -k session\n-w /var/log/wtmp -p wa -k session\n-w /var/log/btmp -p wa -k session\n開啟終端機，執行以下指令，載入修改後之設定檔：\n#augenrules --load\n開啟終端機，執行以下指令，若指令輸出enabled 2，表示稽核組態已鎖定，需重新開機才能載入修改後之設定檔：\n#auditctl -s | grep enabled",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0132",
    "category": "日誌與稽核",
    "name": "記錄變更日期與時間事件",
    "description": "這項原則設定決定是否記錄變更日期或時間資訊之事件\n下列為系統日期與時間相關參數：\nadjtimex：調整系統核心時間\nsettimeofday：以時區方式設定系統時間\nstime：以秒為單位設定系統時間(從1970年1月1日到現在的秒數)\nclock_settime：設定內部時鐘與計時器\n建議系統於/var/log/audit.log檔案中記錄包含adjtimex、settimeofday、stime及clock_settime等系統呼叫(System calls)進行日期與時間變更之事件，並標記為「time-change」\n非預期之系統日期與時間變更，可能是惡意活動的跡象，有助於發現異常行為",
    "method": "開啟終端機，執行vim指令，在/etc/audit/rules.d/目錄，新增或編輯「audit.rules」檔案，範例如下：\n#vim /etc/audit/rules.d/audit.rules\n在檔案中加入以下內容：\n-a always,exit -F arch=b64 -S adjtimex,settimeofday,clock_settime -k time-change\n-a always,exit -F arch=b32 -S adjtimex,settimeofday,clock_settime -k time-change\n-w /etc/localtime -p wa -k time-change\n開啟終端機，執行以下指令，載入修改後之設定檔：\n#augenrules --load\n開啟終端機，執行以下指令，若指令輸出enabled 2，表示稽核組態已鎖定，需重新開機才能載入修改後之設定檔：\n#auditctl -s | grep enabled",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0133",
    "category": "日誌與稽核",
    "name": "記錄變更系統強制存取控制事件",
    "description": "這項原則設定決定是否記錄變更系統強制存取控制(Mandatory Access Controls)事件，包含/etc/apparmor與/etc/apparmor.d/目錄屬性變更，以及在目錄內新增、刪除或修改檔案之事件\n當/etc/apparmor/與/etc/apparmor.d/目錄屬性或檔案遭非預期變更，代表未授權使用者嘗試變更存取控制或改變安全設定，將可能導致系統被入侵，應進行記錄，並標記為「MAC-policy」",
    "method": "開啟終端機，執行vim指令，在/etc/audit/rules.d/目錄，新增或編輯「audit.rules」檔案，範例如下：\n#vim /etc/audit/rules.d/audit.rules\n在檔案中加入以下內容：\n-w /etc/apparmor/ -p wa -k MAC-policy\n-w /etc/apparmor.d/ -p wa -k MAC-policy\n開啟終端機，執行以下指令，載入修改後之設定檔：\n#augenrules --load\n開啟終端機，執行以下指令，若指令輸出enabled 2，表示稽核組態已鎖定，需重新開機才能載入修改後之設定檔：\n#auditctl -s | grep enabled",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0134",
    "category": "日誌與稽核",
    "name": "記錄變更系統網路環境事件",
    "description": "這項原則設定決定是否記錄變更系統網路環境之事件\n當主機名稱與網域名稱變更時，可能會破壞與這2個參數相關的安全設定\n/etc/hosts為用來定義主機名稱與IP位置對應的檔案，攻擊者可能竄改此檔案內容，將連線導向其他主機\n攻擊者也可能利用/etc/issue與/etc/issue.net放置錯誤訊息登入畫面，誘騙使用者提供資訊\n當/etc/issue、/etc/issue.net及 /etc/hosts等檔案被變更，或使用sethostname與setdomainname等系統呼叫變更名稱時，應進行記錄並標記為「system-locale」",
    "method": "開啟終端機，執行vim指令，在/etc/audit/rules.d/目錄，新增或編輯「audit.rules」檔案，範例如下：\n#vim /etc/audit/rules.d/audit.rules\n在檔案中加入以下內容：\n-a always,exit -F arch=b64 -S sethostname,setdomainname -k system-locale\n-a always,exit -F arch=b32 -S sethostname,setdomainname -k system-locale\n-w /etc/issue -p wa -k system-locale\n-w /etc/issue.net -p wa -k system-locale\n-w /etc/hosts -p wa -k system-locale\n-w /etc/networks -p wa -k system-locale\n-w /etc/network/ -p wa -k system-locale\n開啟終端機，執行以下指令，載入修改後之設定檔：\n#augenrules --load\n開啟終端機，執行以下指令，若指令輸出enabled 2，表示稽核組態已鎖定，需重新開機才能載入修改後之設定檔：\n#auditctl -s | grep enabled",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0135",
    "category": "日誌與稽核",
    "name": "記錄變更自主存取控制權限事件",
    "description": "這項原則設定決定是否記錄變更自主存取控制(Discretionary Access Control, DAC)權限之事件\n記錄變更檔案權限(例如：chmod、fchmod及fchmodat)、檔案延伸屬性(例如：setxattr、lsetxattr、fsetxattr、removexattr、lremovexattr及fremovexattr)、擁有者及擁有群組(例如：chown、fchown、fchownat及lchown)之事件\n稽核紀錄僅記錄系統使用者(auid>=1000，並忽略守護程序auid=unset)所產生之事件，並標記為「perm_mod」\n監控檔案屬性之變更，可為系統管理者提供攻擊者跡象或違反原則行為",
    "method": "開啟終端機，執行vim指令，在/etc/audit/rules.d/目錄，新增或編輯「audit.rules」檔案，範例如下：\n#vim /etc/audit/rules.d/audit.rules\n在檔案中加入以下內容：\n-a always,exit -F arch=b64 -S chmod,fchmod,fchmodat -F auid>=1000 -F auid!=unset -k perm_mod\n-a always,exit -F arch=b32 -S chmod,fchmod,fchmodat -F auid>=1000 -F auid!=unset -k perm_mod\n-a always,exit -F arch=b64 -S chown,fchown,lchown,fchownat -F auid>=1000 -F auid!=unset -k perm_mod\n-a always,exit -F arch=b32 -S chown,fchown,lchown,fchownat -F auid>=1000 -F auid!=unset -k perm_mod\n-a always,exit -F arch=b64 -S setxattr,lsetxattr,fsetxattr,removexattr,lremovexattr,fremovexattr -F auid>=1000 -F auid!=unset -k perm_mod\n-a always,exit -F arch=b32 -S setxattr,lsetxattr,fsetxattr,removexattr,lremovexattr,fremovexattr -F auid>=1000 -F auid!=unset -k perm_mod\n開啟終端機，執行以下指令，載入修改後之設定檔：\n#augenrules --load\n開啟終端機，執行以下指令，若指令輸出enabled 2，表示稽核組態已鎖定，需重新開機才能載入修改後之設定檔：\n#auditctl -s | grep enabled",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0136",
    "category": "日誌與稽核",
    "name": "記錄不成功之未經授權檔案存取",
    "description": "這項原則設定決定是否記錄所有使用者未經授權存取檔案之行為\n建議設定系統監控包含控制建立(creat)、開啟(open、openat)及截斷(truncate、ftruncate)等系統呼叫存取檔案之行為，並針對系統使用者(auid>=1000，並忽略守護程序auid=unset)，且顯示對此檔案無權限(EACCES)或系統呼叫參數錯誤(EPERM)等事件進行記錄，並標記為「access」\n開啟、建立或截斷檔案的失敗嘗試，代表可能有使用者或程序試圖對系統進行未授權存取",
    "method": "開啟終端機，執行vim指令，在/etc/audit/rules.d/目錄，新增或編輯「audit.rules」檔案，範例如下：\n#vim /etc/audit/rules.d/audit.rules\n在檔案中加入以下內容：\n-a always,exit -F arch=b64 -S creat,open,openat,truncate,ftruncate -F exit=-EACCES -F auid>=1000 -F auid!=unset -k access\n-a always,exit -F arch=b32 -S creat,open,openat,truncate,ftruncate -F exit=-EACCES -F auid>=1000 -F auid!=unset -k access\n-a always,exit -F arch=b64 -S creat,open,openat,truncate,ftruncate -F exit=-EPERM -F auid>=1000 -F auid!=unset -k access\n-a always,exit -F arch=b32 -S creat,open,openat,truncate,ftruncate -F exit=-EPERM -F auid>=1000 -F auid!=unset -k access\n開啟終端機，執行以下指令，載入修改後之設定檔：\n#augenrules --load\n開啟終端機，執行以下指令，若指令輸出enabled 2，表示稽核組態已鎖定，需重新開機才能載入修改後之設定檔：\n#auditctl -s | grep enabled",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0137",
    "category": "日誌與稽核",
    "name": "記錄變更使用者或群組資訊事件",
    "description": "這項原則設定決定是否記錄變更使用者或群組資訊之事件\n當/etc目錄下group、passwd、gshadow、shadow及opasswd等檔案被修改或變更檔案屬性(例如權限)時，應進行記錄並標記為「identity」\n這些檔案遭非預期變更，代表系統可能已被入侵，或攻擊者想要隱藏蹤跡，或入侵其他使用者帳號",
    "method": "開啟終端機，執行vim指令，在/etc/audit/rules.d/目錄，新增或編輯「audit.rules」檔案，範例如下：\n#vim /etc/audit/rules.d/audit.rules\n在檔案中加入以下內容：\n-w /etc/group -p wa -k identity\n-w /etc/passwd -p wa -k identity\n-w /etc/gshadow -p wa -k identity\n-w /etc/shadow -p wa -k identity\n-w /etc/security/opasswd -p wa -k identity\n開啟終端機，執行以下指令，載入修改後之設定檔：\n#augenrules --load\n開啟終端機，執行以下指令，若指令輸出enabled 2，表示稽核組態已鎖定，需重新開機才能載入修改後之設定檔：\n#auditctl -s | grep enabled",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0138",
    "category": "日誌與稽核",
    "name": "記錄變更檔案系統掛載事件",
    "description": "這項原則設定決定是否記錄檔案系統掛載之事件\n對於非系統管理者而言，將檔案系統掛載到系統為異常行為，潛在有資料未經授權匯出至外部儲存裝置之風險\n建議設定系統監控mount與umount系統呼叫檔案系統掛載之行為，針對系統使用者(auid>=1000，並忽略守護程序auid=unset)所產生之事件，並標記為「mounts」",
    "method": "開啟終端機，執行vim指令，在/etc/audit/rules.d/目錄，新增或編輯「audit.rules」檔案，範例如下：\n#vim /etc/audit/rules.d/audit.rules\n在檔案中加入以下內容：\n-a always,exit -F arch=b64 -S mount -F auid>=1000 -F auid!=unset -k mounts\n-a always,exit -F arch=b32 -S mount -F auid>=1000 -F auid!=unset -k mounts\n開啟終端機，執行以下指令，載入修改後之設定檔：\n#augenrules --load\n開啟終端機，執行以下指令，若指令輸出enabled 2，表示稽核組態已鎖定，需重新開機才能載入修改後之設定檔：\n#auditctl -s | grep enabled",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0139",
    "category": "日誌與稽核",
    "name": "記錄特權指令使用情形",
    "description": "這項原則設定決定是否記錄特權指令使用情形\n特權指令是指具有setuid或setgid特權的程式，任何人執行該程式時，會以該程式之擁有者的身分執行，藉由短暫提權讓一般使用者存取未被授權之檔案。因此須監控特權指令使用狀況，以及早發現使用者非法存取未授權資源之情形\n建議系統監控與記錄系統使用者(auid>=1000，並忽略守護程序auid=unset)使用特權指令所產生之事件，並標記為「privileged」",
    "method": "開啟終端機，執行以下指令，在系統上所有磁區(partition)，逐一檢查磁區所掛載之檔案目錄(如根目錄)中的特權程式，並為每個特權程序的執行，建立稽核規則：\n#find (partition) -xdev \\( -perm -4000 -o -perm -2000 \\) -type f | awk '{print \"-a always,exit -F path=\" $1 \" -F perm=x -F auid>=1000 -F auid!=unset -k privileged\" }'\n在/etc/audit/rules.d/目錄，新增或編輯「privileged.rules」檔案，將根磁區(root partition)的特權程式稽核規則加入到該檔案，指令範例如下：\n#find / -xdev \\( -perm -4000 -o -perm -2000 \\) -type f | awk '{print \"-a always,exit -F path=\" $1 \" -F perm=x -F auid>=1000 -F auid!=unset -k privileged\" }' >> /etc/audit/rules.d/privileged.rules\n開啟終端機，執行以下指令，載入修改後之設定檔：\n#augenrules --load\n開啟終端機，執行以下指令，若指令輸出enabled 2，表示稽核組態已鎖定，需重新開機才能載入修改後之設定檔：\n#auditctl -s | grep enabled",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0140",
    "category": "日誌與稽核",
    "name": "記錄檔案刪除事件",
    "description": "這項原則設定決定是否蒐集使用者利用unlink、unlinkat、rename或renameat等系統呼叫進行刪除檔案、移除檔案屬性、更換檔名或路徑等事件\n相關系統呼叫之功能如下：\nunlink：刪除檔案\nunlinkat：刪除檔案或目錄\nrename：變更檔名\nrenameat：變更檔名或路徑\nrmdir：刪除空資料夾\n建議系統監控並記錄系統使用者(auid>=1000，並忽略守護程序auid=unset)所產生之事件，並標記為「delete」",
    "method": "開啟終端機，執行vim指令，在/etc/audit/rules.d/目錄，新增或編輯「audit.rules」檔案，範例如下：\n#vim /etc/audit/rules.d/audit.rules\n在檔案中加入以下內容：\n-a always,exit -F arch=b64 -S rename,unlink,unlinkat,renameat,rmdir -F auid>=1000 -F auid!=unset -k delete\n-a always,exit -F arch=b32 -S rename,unlink,unlinkat,renameat,rmdir -F auid>=1000 -F auid!=unset -k delete\n開啟終端機，執行以下指令，載入修改後之設定檔：\n#augenrules --load\n開啟終端機，執行以下指令，若指令輸出enabled 2，表示稽核組態已鎖定，需重新開機才能載入修改後之設定檔：\n#auditctl -s | grep enabled",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0141",
    "category": "日誌與稽核",
    "name": "記錄核心模組掛載、卸載及修改事件",
    "description": "這項原則設定決定是否記錄核心模組掛載、卸載及修改事件\n核心模組掛載、卸載及修改事件包含掛載模組(init_module與finit_module)、刪除模組(delete_module)、新增模組(create_module)及查詢模組(query_module)事件\n建議系統監控與記錄核心模組掛載、卸載及修改事件，並標記為「kernel_modules」\n核心模組掛載與卸載事件紀錄反映系統有未經授權的使用者掛載與卸載核心模組，可能損害系統的安全性",
    "method": "開啟終端機，執行vim指令，在/etc/audit/rules.d/目錄，新增或編輯「audit.rules」檔案，範例如下：\n#vim /etc/audit/rules.d/audit.rules\n在檔案中加入以下內容：\n-a always,exit -F arch=b64 -S init_module,finit_module,delete_module,create_module,query_module -F auid>=1000 -F auid!=unset -k kernel_modules\n-a always,exit -F arch=b32 -S init_module,finit_module,delete_module,create_module,query_module -F auid>=1000 -F auid!=unset -k kernel_modules\n開啟終端機，執行以下指令，載入修改後之設定檔：\n#augenrules --load\n開啟終端機，執行以下指令，若指令輸出enabled 2，表示稽核組態已鎖定，需重新開機才能載入修改後之設定檔：\n#auditctl -s | grep enabled",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0142",
    "category": "日誌與稽核",
    "name": "記錄系統管理者活動日誌變更",
    "description": "這項原則設定決定是否記錄系統管理者活動日誌(sudo.log)變更之事件\n當使用者以sudo執行特權指令，系統會自動根據/etc/sudoers檔案，判斷該使用者是否具有執行sudo的權限，並將所有管理者指令都記錄到/var/log/sudo.log\n建議系統監控與記錄/var/log/sudo.log檔案寫入狀況或屬性變更情形，並標記為「sudo_log_file」\n/var/log/sudo.log檔案若遭修改，代表系統管理員已執行sudo指令，或是檔案遭未經授權竄改\n系統管理者可將稽核事件與/var/log/sudo.log紀錄內容進行比對，以驗證是否有未經授權指令被執行",
    "method": "開啟終端機，執行指令如下，尋找sudo日誌檔案路徑\n#grep -r logfile /etc/sudoers* | sed -e 's/.*logfile=//;s/,? .*//'\n執行vim指令，在/etc/audit/rules.d/目錄，新增或編輯「actions.rules」檔案，範例如下：\n#vim /etc/audit/rules.d/actions.rules\n在檔案中加入以下內容：\n-w (sudo日誌檔案路徑) -p wa -k sudo_log_file\n以系統預設路徑「/var/log/sudo.log」為例，在「actions.rules」檔案中加入以下內容：\n-w /var/log/sudo.log -p wa -k sudo_log_file\n開啟終端機，執行以下指令，載入修改後之設定檔：\n#augenrules --load\n開啟終端機，執行以下指令，若指令輸出enabled 2，表示稽核組態已鎖定，需重新開機才能載入修改後之設定檔：\n#auditctl -s | grep enabled",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0143",
    "category": "日誌與稽核",
    "name": "記錄setfacl指令使用情形",
    "description": "這項原則設定決定是否記錄setfacl指令使用情形\nsetfacl指令用於設定檔案之存取控制表(ACL)，建立使用系統重要指令、程序或系統呼叫之稽核紀錄，可提供系統管理者用於調查與分析資安事件\n建議系統監控與記錄系統使用者(auid>=1000，並忽略守護程序auid=unset)使用setfacl指令所產生之事件，並標記為「perm_chng」",
    "method": "開啟終端機，執行vim指令，在/etc/audit/rules.d/目錄，新增或編輯「audit.rules」檔案，範例如下：\n#vim /etc/audit/rules.d/audit.rules\n在檔案中加入以下內容：\n-a always,exit -F path=/usr/bin/setfacl -F perm=x -F auid>=1000 -F auid!=unset -k perm_chng\n開啟終端機，執行以下指令，載入修改後之設定檔：\n#augenrules --load\n開啟終端機，執行以下指令，若指令輸出enabled 2，表示稽核組態已鎖定，需重新開機才能載入修改後之設定檔：\n#auditctl -s | grep enabled",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0144",
    "category": "日誌與稽核",
    "name": "記錄usermod指令使用情形",
    "description": "這項原則設定決定是否記錄usermod指令使用情形\nusermod指令可用於修改使用者帳號設定，建立使用系統重要指令、程序或系統呼叫之稽核紀錄，可提供系統管理者用於調查與分析資安事件\n建議系統監控與記錄系統使用者(auid>=1000，並忽略守護程序auid=unset)使用usermod指令所產生之事件，並標記為「usermod」",
    "method": "開啟終端機，執行vim指令，在/etc/audit/rules.d/目錄，新增或編輯「audit.rules」檔案，範例如下：\n#vim /etc/audit/rules.d/audit.rules\n在檔案中加入以下內容：\n-a always,exit -F path=/usr/sbin/usermod -F perm=x -F auid>=1000 -F auid!=unset -k usermod\n開啟終端機，執行以下指令，載入修改後之設定檔：\n#augenrules --load\n開啟終端機，執行以下指令，若指令輸出enabled 2，表示稽核組態已鎖定，需重新開機才能載入修改後之設定檔：\n#auditctl -s | grep enabled",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0145",
    "category": "日誌與稽核",
    "name": "記錄chacl指令使用情形",
    "description": "這項原則設定決定是否記錄chacl指令使用情形\nchacl指令用於更改檔案或目錄之存取控制表(ACL)，建立使用系統重要指令、程序或系統呼叫之稽核紀錄，可提供系統管理者用於調查與分析資安事件\n建議系統監控與記錄系統使用者(auid>=1000，並忽略守護程序auid=unset)使用chacl指令指令所產生之事件，並標記為「perm_chng」",
    "method": "開啟終端機，執行vim指令，在/etc/audit/rules.d/目錄，新增或編輯「audit.rules」檔案，範例如下：\n#vim /etc/audit/rules.d/audit.rules\n在檔案中加入以下內容：\n-a always,exit -F path=/usr/bin/chacl -F perm=x -F auid>=1000 -F auid!=unset -k perm_chng\n開啟終端機，執行以下指令，載入修改後之設定檔：\n#augenrules --load\n開啟終端機，執行以下指令，若指令輸出enabled 2，表示稽核組態已鎖定，需重新開機才能載入修改後之設定檔：\n#auditctl -s | grep enabled",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0146",
    "category": "日誌與稽核",
    "name": "記錄kmod指令使用情形",
    "description": "這項原則設定決定是否記錄kmod指令使用情形\nkmod指令用於控制Linux核心模組，建立使用系統重要指令、程序或系統呼叫之稽核紀錄，可提供系統管理者用於調查與分析資安事件\n建議系統監控與記錄使用kmod指令所產生之事件，並標記為「kernel_modules」",
    "method": "開啟終端機，執行vim指令，在/etc/audit/rules.d/目錄，新增或編輯「audit.rules」檔案，範例如下：\n#vim /etc/audit/rules.d/audit.rules\n在檔案中加入以下內容：\n-a always,exit -F path=/usr/bin/kmod -F perm=x -F auid>=1000 -F auid!=unset -k kernel_modules\n開啟終端機，執行以下指令，載入修改後之設定檔：\n#augenrules --load\n開啟終端機，執行以下指令，若指令輸出enabled 2，表示稽核組態已鎖定，需重新開機才能載入修改後之設定檔：\n#auditctl -s | grep enabled",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0147",
    "category": "日誌與稽核",
    "name": "記錄execve系統呼叫使用情形",
    "description": "這項原則設定決定是否記錄execve系統呼叫使用情形\nexecve系統呼叫可建立新的程序取代執行中的程序並保持相同PID(Process ID)，建立使用系統重要指令、程序或系統呼叫之稽核紀錄，可提供系統管理者用於調查與分析資安事件\n建議系統監控與記錄execve系統呼叫使用情形並忽略守護程序auid=unset，以避免程序使用比使用者更高權限執行而產生安全漏洞",
    "method": "開啟終端機，執行vim指令，在/etc/audit/rules.d/目錄，新增或編輯「audit.rules」檔案，範例如下：\n#vim /etc/audit/rules.d/audit.rules\n在檔案中加入以下內容：\n-a always,exit -F arch=b32 -F auid!=unset -S execve -C uid!=euid -k user_emulation \n-a always,exit -F arch=b64 -F auid!=unset -S execve -C uid!=euid -k user_emulation\n-a always,exit -F arch=b32 -F auid!=unset -S execve -C gid!=egid -k user_emulation\n-a always,exit -F arch=b64 -F auid!=unset -S execve -C gid!=egid -k user_emulation\n開啟終端機，執行以下指令，載入修改後之設定檔：\n#augenrules --load\n開啟終端機，執行以下指令，若指令輸出enabled 2，表示稽核組態已鎖定，需重新開機才能載入修改後之設定檔：\n#auditctl -s | grep enabled",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0148",
    "category": "日誌與稽核",
    "name": "auditd設定不變模式",
    "description": "這項原則設定決定是否啟用auditd設定不變模式(Immutable mode)\n如果設為不變模式，使用者即使使用auditctl指令變更稽核規則，新稽核規則不會立即作用，必須重新開機後才能生效\n設為不變模式後，任何稽核規則變更必須重新開機後才會生效，藉此可防止惡意使用者利用變更稽核規則來隱藏惡意活動，亦可協助系統管理者藉由觀察非預期的重新開機，研判系統是否存在惡意活動\n「-e」可設定參數如下；\n設為0：停用稽核\n設為1：啟用稽核\n設為2：稽核設定不變模式",
    "method": "在/etc/audit/rules.d/目錄，新增或編輯稽核規則中最後被執行的「.rules」檔案：\n在該檔案的最後一行加入以下內容：\n-e 2\n執行以下終端機指令，若輸出結果出現「-e 2」，代表設定完成：\n#grep -h \"^\\s*[^#]\" /etc/audit/rules.d/*.rules | egrep \"-e 2\"",
    "expected": "2",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0149",
    "category": "日誌與稽核",
    "name": "rsyslog套件",
    "description": "這項原則設定決定是否安裝rsyslog套件\nrsyslog為系統公用程式，提供系統資訊記錄功能，支援本機端日誌紀錄，並以加密傳輸方式發送日誌紀錄至遠端伺服器，以及可用資料庫儲存日誌紀錄\n安裝rsyslog套件，為系統日誌管理提供更完備之功能",
    "method": "開啟終端機，執行以下指令，安裝rsyslog套件：\n#apt install rsyslog",
    "expected": "安裝",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0150",
    "category": "日誌與稽核",
    "name": "rsyslog服務",
    "description": "這項原則設定決定是否啟用rsyslog服務\nrsyslog為系統公用程式，提供系統資訊記錄功能，支援本機端日誌紀錄，並以加密傳輸方式發送日誌紀錄至遠端伺服器，以及可用資料庫儲存日誌紀錄\n啟用rsyslog服務，為系統日誌管理提供更完備之功能",
    "method": "開啟終端機，執行以下指令，啟用rsyslog服務：\n#systemctl --now enable rsyslog",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0151",
    "category": "日誌與稽核",
    "name": "設定rsyslog日誌檔案預設權限",
    "description": "這項原則決定是否設定rsyslog日誌檔案預設權限\nrsyslog在有需求時會為系統建立新日誌檔案，「$FileCreateMode」參數用於控制新增日誌檔案之預設權限\n為日誌檔案設定預設權限，以保護系統機敏資料",
    "method": "編輯/etc/rsyslog.conf檔案與 /etc/rsyslog.d/目錄下的「.conf」檔案，設定參數「$FileCreateMode」為0640或更低權限，範例如下：\n$FileCreateMode 0640",
    "expected": "0640或更低權限",
    "check_cmd": "systemctl is-enabled rsyslog 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable rsyslog"
  },
  {
    "id": "TWGCB-01-014-0152",
    "category": "日誌與稽核",
    "name": "設定journald將日誌發送到rsyslog",
    "description": "這項原則設定決定是否設定journald將日誌發送到rsyslog\nsystemd是Linux系統設定管理程式，並提供journald做為自身之日誌系統，journald的資料可以暫存於記憶體或永久保存在伺服器上，並允許將日誌從journald匯出至rsyslog\n啟用journald將日誌發送到rsyslog，以透過rsyslog服務提供一致性之日誌保存方式",
    "method": "編輯/etc/systemd/journald.conf檔案，新增以下內容：\nForwardToSyslog=yes\n開啟終端機，執行以下指令重新啟動rsyslog服務：\n#systemctl restart rsyslog",
    "expected": "yes",
    "check_cmd": "systemctl is-active systemd-journald 2>/dev/null | grep -q active && echo PASS || echo FAIL",
    "remediation": "sudo systemctl restart systemd-journald"
  },
  {
    "id": "TWGCB-01-014-0153",
    "category": "日誌與稽核",
    "name": "設定journald壓縮日誌檔案",
    "description": "這項原則設定決定是否設定journald壓縮日誌檔案\nsystemd是Linux系統設定管理程式，並提供journald做為自身之日誌系統，journald的資料可以暫存於記憶體或永久保存在伺服器上，並允許將日誌從journald匯出至rsyslog\njournald可壓縮過大日誌檔案，啟用此功能可避免日誌檔案占用空間與資源，導致系統異常",
    "method": "編輯/etc/systemd/journald.conf檔案，新增以下內容：\nCompress=yes\n開啟終端機，執行以下指令重新啟動systemd-journald服務：\n#systemctl restart systemd-journald",
    "expected": "yes",
    "check_cmd": "systemctl is-active systemd-journald 2>/dev/null | grep -q active && echo PASS || echo FAIL",
    "remediation": "sudo systemctl restart systemd-journald"
  },
  {
    "id": "TWGCB-01-014-0154",
    "category": "日誌與稽核",
    "name": "設定journald將日誌檔案永久保存於磁碟",
    "description": "這項原則設定決定是否設定journald將日誌檔案永久保存於磁碟\nsystemd是Linux系統設定管理程式，並提供journald做為自身之日誌系統，journald之資料可以暫存於記憶體或永久保存在伺服器上，並允許將日誌從journald匯出至rsyslog\n設定將日誌檔案永久保存於磁諜中，可提供系統管理者分析資安事件發生原因",
    "method": "編輯/etc/systemd/journald.conf檔案，新增以下內容：\nStorage=persistent \n開啟終端機，執行以下指令重新啟動systemd-journald服務：\n#systemctl restart systemd-journald",
    "expected": "persistent",
    "check_cmd": "systemctl is-active systemd-journald 2>/dev/null | grep -q active && echo PASS || echo FAIL",
    "remediation": "sudo systemctl restart systemd-journald"
  },
  {
    "id": "TWGCB-01-014-0155",
    "category": "AppArmor",
    "name": "AppArmor套件",
    "description": "這項原則設定決定是否安裝AppArmor套件\nAppArmor是一個Linux核心安全模組，提供強制存取控制(Mandatory Access Control, MAC)安全性原則，可強制Linux系統中之檔案與程序依據定義的原則限制存取行為，啟用AppArmor有助於提升伺服器安全性",
    "method": "開啟終端機，執行以下指令安裝AppArmor：\n#apt install apparmor",
    "expected": "安裝",
    "check_cmd": "systemctl is-enabled apparmor 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable apparmor"
  },
  {
    "id": "TWGCB-01-014-0156",
    "category": "AppArmor",
    "name": "開機載入程式啟用AppArmor",
    "description": "這項原則設定決定是否在開機載入程式中啟用AppArmor\n在開機載入程式中啟用AppArmor，確保AppArmor正常運作，以提升伺服器安全性",
    "method": "編輯/etc/default/grub檔案，在GRUB_CMDLINE_LINUX參數設定加入「apparmor=1」與「security=apparmor」，範例如下：\nGRUB_CMDLINE_LINUX =\"apparmor=1 security=apparmor\"\n開啟終端機，執行以下指令更新grub2設定檔：\n#update-grub",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled apparmor 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable apparmor"
  },
  {
    "id": "TWGCB-01-014-0157",
    "category": "AppArmor",
    "name": "AppArmor啟用狀態",
    "description": "這項原則設定決定AppArmor之啟用模式\n模式選項如下：\nEnforce：強制模式，依據設定來限制檔案資源存取\nComplain：抱怨模式，不限制檔案資源存取，但仍會依據設定檢查並記錄相關訊息\nDisable：停用模式，停用AppArmor\n注意：建議先進行測試再啟用AppArmor，並於啟用後確認各項系統服務可正常運作",
    "method": "開啟終端機，執行以下指令啟用強制(Enforce)模式：\n#aa-enforce /etc/apparmor.d/*",
    "expected": "Enforce",
    "check_cmd": "systemctl is-enabled apparmor 2>/dev/null | grep -q enabled && echo PASS || echo FAIL",
    "remediation": "sudo systemctl enable apparmor"
  },
  {
    "id": "TWGCB-01-014-0158",
    "category": "cron設定",
    "name": "cron守護程序",
    "description": "這項原則設定決定是否啟用cron守護程序\ncron守護程序是Linux系統上基於時間的任務管理系統，可透過cron以排程方式於固定時間、日期及間隔執行任務\n啟用cron守護程序，以執行包含安全監控等系統維護作業",
    "method": "開啟終端機，執行以下指令，啟用cron守護程序：\n#systemctl --now enable cron",
    "expected": "啟用",
    "check_cmd": "stat -c '%a' /etc/crontab 2>/dev/null | grep -q '600' && echo PASS || echo FAIL",
    "remediation": "sudo chmod 600 /etc/crontab"
  },
  {
    "id": "TWGCB-01-014-0159",
    "category": "cron設定",
    "name": "/etc/crontab檔案所有權",
    "description": "這項原則設定決定是否設定/etc/crontab檔案擁有者與群組\ncron使用/etc/crontab檔案來控制自身的作業，檔案中包含cron所運行的系統作業資訊\n為/etc/crontab檔案設定擁有者與群組，以保護檔案避免遭未經授權存取，進而嘗試提升權限",
    "method": "開啟終端機，執行以下指令，設定/etc/crontab檔案擁有者與群組：\n#chown root:root /etc/crontab",
    "expected": "root:root",
    "check_cmd": "stat -c '%a' /etc/crontab 2>/dev/null | grep -q '600' && echo PASS || echo FAIL",
    "remediation": "sudo chmod 600 /etc/crontab"
  },
  {
    "id": "TWGCB-01-014-0160",
    "category": "cron設定",
    "name": "/etc/crontab檔案權限",
    "description": "這項原則設定決定是否設定/etc/crontab檔案權限\ncron使用/etc/crontab檔案來控制自身的作業，檔案中包含cron所運行的系統作業資訊\n為/etc/crontab檔案設定權限，以保護檔案避免遭未經授權存取，進而嘗試提升權限",
    "method": "開啟終端機，執行以下指令，設定/etc/crontab權限為600或更低權限：\n#chmod 600 /etc/crontab",
    "expected": "600或更低權限",
    "check_cmd": "stat -c '%a' /etc/crontab 2>/dev/null | grep -q '600' && echo PASS || echo FAIL",
    "remediation": "sudo chmod 600 /etc/crontab"
  },
  {
    "id": "TWGCB-01-014-0161",
    "category": "cron設定",
    "name": "/etc/cron.hourly目錄所有權",
    "description": "這項原則設定決定是否設定/etc/cron.hourly目錄擁有者與群組\n/etc/cron.hourly目錄包含cron每小時需要執行的作業資訊，此目錄下之檔案無法使用crontab命令進行操作，而是由系統管理者以編輯器進行編輯\n為/etc/cron.hourly目錄設定擁有者與群組，限制一般使用者存取權限，以避免藉此進而提升權限",
    "method": "開啟終端機，執行以下指令，設定/etc/cron.hourly目錄擁有者與群組：\n#chown root:root /etc/cron.hourly",
    "expected": "root:root",
    "check_cmd": "stat -c '%a' /etc/cron.hourly 2>/dev/null | grep -q '700' && echo PASS || echo FAIL",
    "remediation": "sudo chmod 700 /etc/cron.hourly"
  },
  {
    "id": "TWGCB-01-014-0162",
    "category": "cron設定",
    "name": "/etc/cron.hourly目錄權限",
    "description": "這項原則設定決定是否設定/etc/cron.hourly目錄權限\n/etc/cron.hourly目錄包含cron每小時需要執行的作業資訊，此目錄下之檔案無法使用crontab命令進行操作，而是由系統管理者以編輯器進行編輯\n為/etc/cron.hourly目錄設定權限，限制一般使用者存取權限，以避免藉此進而提升權限",
    "method": "開啟終端機，執行以下指令，設定/etc/cron.hourly目錄權限為700或更低權限：\n#chmod 700 /etc/cron.hourly",
    "expected": "700或更低權限",
    "check_cmd": "stat -c '%a' /etc/cron.hourly 2>/dev/null | grep -q '700' && echo PASS || echo FAIL",
    "remediation": "sudo chmod 700 /etc/cron.hourly"
  },
  {
    "id": "TWGCB-01-014-0163",
    "category": "cron設定",
    "name": "/etc/cron.daily目錄所有權",
    "description": "這項原則設定決定是否設定/etc/cron.daily目錄擁有者與群組\n/etc/cron.daily目錄包含cron每日需要執行的作業資訊，此目錄下之檔案無法使用crontab命令進行操作，而是由系統管理者以編輯器進行編輯\n為/etc/cron.daily目錄設定擁有者與群組，限制一般使用者存取權限，以避免藉此進而提升權限",
    "method": "開啟終端機，執行以下指令，設定/etc/cron.daily目錄擁有者與群組：\n#chown root:root /etc/cron.daily",
    "expected": "root:root",
    "check_cmd": "stat -c '%a' /etc/cron.daily 2>/dev/null | grep -q '700' && echo PASS || echo FAIL",
    "remediation": "sudo chmod 700 /etc/cron.daily"
  },
  {
    "id": "TWGCB-01-014-0164",
    "category": "cron設定",
    "name": "/etc/cron.daily目錄權限",
    "description": "這項原則設定決定是否設定/etc/cron.daily目錄權限\n/etc/cron.daily目錄包含cron每日需要執行的作業資訊，此目錄下之檔案無法使用crontab命令進行操作，而是由系統管理者以編輯器進行編輯\n為/etc/cron.daily目錄設定權限，限制一般使用者存取權限，以避免藉此進而提升權限",
    "method": "開啟終端機，執行以下指令，設定/etc/cron.daily目錄權限為700或更低權限：\n#chmod 700 /etc/cron.daily",
    "expected": "700或更低權限",
    "check_cmd": "stat -c '%a' /etc/cron.daily 2>/dev/null | grep -q '700' && echo PASS || echo FAIL",
    "remediation": "sudo chmod 700 /etc/cron.daily"
  },
  {
    "id": "TWGCB-01-014-0165",
    "category": "cron設定",
    "name": "/etc/cron.weekly目錄所有權",
    "description": "這項原則設定決定是否設定/etc/cron.weekly目錄擁有者與群組\n/etc/cron.weekly目錄包含cron每週需要執行的作業資訊，此目錄下之檔案無法使用crontab命令進行操作，而是由系統管理者以編輯器進行編輯\n為/etc/cron.weekly目錄設定擁有者與群組，限制一般使用者存取權限，以避免藉此進而提升權限",
    "method": "開啟終端機，執行以下指令，設定/etc/cron.weekly目錄擁有者與群組：\n#chown root:root /etc/cron.weekly",
    "expected": "root:root",
    "check_cmd": "stat -c '%a' /etc/cron.weekly 2>/dev/null | grep -q '700' && echo PASS || echo FAIL",
    "remediation": "sudo chmod 700 /etc/cron.weekly"
  },
  {
    "id": "TWGCB-01-014-0166",
    "category": "cron設定",
    "name": "/etc/cron.weekly目錄權限",
    "description": "這項原則設定決定是否設定/etc/cron.weekly目錄權限\n/etc/cron.weekly目錄包含cron每週需要執行的作業資訊，此目錄下之檔案無法使用crontab命令進行操作，而是由系統管理者以編輯器進行編輯\n為/etc/cron.weekly目錄設定權限，限制一般使用者存取權限，以避免藉此進而提升權限",
    "method": "開啟終端機，執行以下指令，設定/etc/cron.weekly目錄權限為700或更低權限：\n#chmod 700 /etc/cron.weekly",
    "expected": "700或更低權限",
    "check_cmd": "stat -c '%a' /etc/cron.weekly 2>/dev/null | grep -q '700' && echo PASS || echo FAIL",
    "remediation": "sudo chmod 700 /etc/cron.weekly"
  },
  {
    "id": "TWGCB-01-014-0167",
    "category": "cron設定",
    "name": "/etc/cron.monthly目錄所有權",
    "description": "這項原則設定決定是否設定/etc/cron.monthly目錄擁有者與群組\n/etc/cron.monthly目錄包含cron每月需要執行的作業資訊，此目錄下之檔案無法使用crontab命令進行操作，而是由系統管理者以編輯器進行編輯\n為/etc/cron.monthly目錄設定擁有者與群組，限制一般使用者存取權限，以避免藉此進而提升權限",
    "method": "開啟終端機，執行以下指令，設定/etc/cron.monthly目錄擁有者與群組：\n#chown root:root /etc/cron.monthly",
    "expected": "root:root",
    "check_cmd": "stat -c '%a' /etc/cron.monthly 2>/dev/null | grep -q '700' && echo PASS || echo FAIL",
    "remediation": "sudo chmod 700 /etc/cron.monthly"
  },
  {
    "id": "TWGCB-01-014-0168",
    "category": "cron設定",
    "name": "/etc/cron.monthly目錄權限",
    "description": "這項原則設定決定是否設定/etc/cron.monthly目錄權限\n/etc/cron.monthly目錄包含每月需要執行的作業資訊，此目錄下之檔案無法使用crontab命令進行操作，而是由系統管理者以編輯器進行編輯\n為/etc/cron.monthly目錄設定權限，限制一般使用者存取權限，以避免藉此提升權限",
    "method": "開啟終端機，執行以下指令，設定/etc/cron.monthly權限為700或更低權限：\n#chmod 700 /etc/cron.monthly",
    "expected": "700或更低權限",
    "check_cmd": "stat -c '%a' /etc/cron.monthly 2>/dev/null | grep -q '700' && echo PASS || echo FAIL",
    "remediation": "sudo chmod 700 /etc/cron.monthly"
  },
  {
    "id": "TWGCB-01-014-0169",
    "category": "cron設定",
    "name": "/etc/cron.d目錄所有權",
    "description": "這項原則設定決定是否設定/etc/cron.d目錄擁有者與群組\n/etc/cron.d目錄包含cron作業資訊，其執行方式與/etc/crontab中的每小時、每日、每週及每月的作業相似，主要用於需更精細控制執行時間的情況。此目錄下之檔案無法使用crontab命令進行操作，而是由系統管理者以編輯器進行編輯\n為/etc/cron.d目錄設定擁有者與群組，限制一般使用者存取權限，以避免藉此進而提升權限",
    "method": "開啟終端機，執行以下指令，設定/etc/cron.d目錄擁有者與群組：\n#chown root:root /etc/cron.d",
    "expected": "root:root",
    "check_cmd": "stat -c '%a' /etc/cron.d 2>/dev/null | grep -q '700' && echo PASS || echo FAIL",
    "remediation": "sudo chmod 700 /etc/cron.d"
  },
  {
    "id": "TWGCB-01-014-0170",
    "category": "cron設定",
    "name": "/etc/cron.d目錄權限",
    "description": "這項原則設定決定是否設定/etc/cron.d目錄權限\n/etc/cron.d目錄包含cron作業資訊，其執行方式與/etc/crontab中的每小時、每日、每週及每月的作業相似，主要使用於需要更精細控制執行時間的情況。此目錄下之檔案無法使用crontab命令進行操作，而是由系統管理者以編輯器進行編輯\n為/etc/cron.d目錄設定權限，限制一般使用者存取權限，以避免藉此進而提升權限",
    "method": "開啟終端機，執行以下指令，設定/etc/cron.d目錄權限為700或更低權限：\n#chmod 700 /etc/cron.d",
    "expected": "700或更低權限",
    "check_cmd": "stat -c '%a' /etc/cron.d 2>/dev/null | grep -q '700' && echo PASS || echo FAIL",
    "remediation": "sudo chmod 700 /etc/cron.d"
  },
  {
    "id": "TWGCB-01-014-0171",
    "category": "cron設定",
    "name": "at.allow與cron.allow檔案所有權",
    "description": "這項原則設定決定是否設定at.allow與cron.allow檔案所有權\n刪除/etc/at.deny與/etc/cron.deny檔案之拒絕清單，並設定/etc/cron.allow與/etc/at.allow檔案所有權，限制僅系統管理者可授權誰可以使用at與cron建立排程工作",
    "method": "開啟終端機，執行以下指令，移除/etc/cron.deny與/etc/at.deny，並建立/etc/cron.allow與/etc/at.allow後，設定其所有權：\n#rm /etc/cron.deny\n#rm /etc/at.deny\n#touch /etc/cron.allow\n#touch /etc/at.allow\n#chown root:root /etc/cron.allow\n#chown root:root /etc/at.allow",
    "expected": "root:root",
    "check_cmd": "[ -f /etc/at.allow ] && echo PASS || echo FAIL",
    "remediation": "sudo touch /etc/at.allow && sudo chmod 640 /etc/at.allow"
  },
  {
    "id": "TWGCB-01-014-0172",
    "category": "cron設定",
    "name": "at.allow與cron.allow檔案權限",
    "description": "這項原則設定決定是否設定at.allow與cron.allow檔案權限\n刪除/etc/at.deny與/etc/cron.deny檔案之拒絕清單，並設定/etc/cron.allow與/etc/at.allow檔案權限，限制僅系統管理者可授權誰可以使用at與cron建立排程工作",
    "method": "開啟終端機，執行以下指令，移除/etc/cron.deny與/etc/at.deny，並建立/etc/cron.allow與/etc/at.allow後，設定其權限為600或更低權限：\n#rm /etc/cron.deny\n#rm /etc/at.deny\n#touch /etc/cron.allow\n#touch /etc/at.allow\n#chmod 600 /etc/cron.allow\n#chmod 600 /etc/at.allow",
    "expected": "600或更低權限",
    "check_cmd": "[ -f /etc/at.allow ] && echo PASS || echo FAIL",
    "remediation": "sudo touch /etc/at.allow && sudo chmod 640 /etc/at.allow"
  },
  {
    "id": "TWGCB-01-014-0173",
    "category": "帳號與存取控制",
    "name": "通行碼最小長度",
    "description": "這項原則設定決定使用者帳號之通行碼須包含之最少字元數\n若使用PAM模組管理通行碼，pam_pwquality.so將會檢驗通行碼相關規則，例如通行碼長度、組成字元及複雜度等，高強度通行碼可降低系統遭攻擊者進行字典檔查詢或暴力破解等通行碼攻擊之影響\nminlen=12：表示通行碼至少包含12個字元",
    "method": "編輯/etc/security/pwquality.conf檔案，新增或修改成以下內容：\nminlen=12",
    "expected": "12個字元以上",
    "check_cmd": "grep -c '' /etc/passwd >/dev/null 2>&1 && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 173 項"
  },
  {
    "id": "TWGCB-01-014-0174",
    "category": "帳號與存取控制",
    "name": "通行碼必須至少包含數字個數",
    "description": "這項原則設定決定使用者帳號之通行碼至少包含幾個數字\n當dcredit大於或等於0時，代表通行碼每出現1個數字時，Length credit加1(最多加到與dcredit相同)\n當dcredit小於0時，代表通行碼必須至少包含之「數字」個數\ndcredit=-1：表示通行碼至少包含1個數字",
    "method": "編輯/etc/security/pwquality.conf檔案，新增或修改成以下內容：\ndcredit=-1",
    "expected": "1個以上",
    "check_cmd": "grep -c '' /etc/passwd >/dev/null 2>&1 && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 174 項"
  },
  {
    "id": "TWGCB-01-014-0175",
    "category": "帳號與存取控制",
    "name": "通行碼必須至少包含大寫字母個數",
    "description": "這項原則設定決定使用者帳號之通行碼至少包含幾個大寫字母\n當ucredit大於或等於0時，代表通行碼每出現1個大寫字母時，Length credit加1(最多加到與ucredit相同)\n當ucredit小於0時，代表通行碼必須至少包含之「大寫字母」個數\nucredit=-1：表示通行碼至少包含1個大寫字母",
    "method": "編輯/etc/security/pwquality.conf檔案，新增或修改成以下內容：\nucredit=-1",
    "expected": "1個以上",
    "check_cmd": "grep -c '' /etc/passwd >/dev/null 2>&1 && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 175 項"
  },
  {
    "id": "TWGCB-01-014-0176",
    "category": "帳號與存取控制",
    "name": "通行碼必須至少包含小寫字母個數",
    "description": "這項原則設定決定使用者帳號之通行碼至少包含幾個小寫字母\n當lcredit大於或等於0時，代表通行碼每出現1個小寫字母時，Length credit加1(最多加到與lcredit相同)\n當lcredit小於0時，代表通行碼必須至少包含之「小寫字母」個數\nlcredit=-1：表示通行碼至少包含1個小寫字母",
    "method": "編輯/etc/security/pwquality.conf檔案，新增或修改成以下內容：\nlcredit=-1",
    "expected": "1個以上",
    "check_cmd": "grep -c '' /etc/passwd >/dev/null 2>&1 && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 176 項"
  },
  {
    "id": "TWGCB-01-014-0177",
    "category": "帳號與存取控制",
    "name": "通行碼必須至少包含特殊字元個數",
    "description": "這項原則設定決定使用者帳號之通行碼至少包含幾個特殊字元\n當ocredit大於或等於0時，代表通行碼每出現1個小寫字母時，Length credit加1(最多加到與ocredit相同)\n當ocredit小於0時，代表通行碼必須至少包含之「特殊字元」個數\nocredit=-1：表示通行碼至少包含1個特殊字元",
    "method": "編輯/etc/security/pwquality.conf檔案，新增或修改成以下內容：\nocredit=-1",
    "expected": "1個以上",
    "check_cmd": "grep -c '' /etc/passwd >/dev/null 2>&1 && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 177 項"
  },
  {
    "id": "TWGCB-01-014-0178",
    "category": "帳號與存取控制",
    "name": "帳戶鎖定閾值",
    "description": "這項原則設定決定使用者帳號被鎖定之嘗試登入失敗次數，以降低通行碼暴力攻擊之影響\ndeny=5：使用者帳號被鎖定之嘗試登入失敗最多5次",
    "method": "編輯/etc/pam.d/common-auth檔案，新增或修改成以下內容：\nauth    required                        pam_faillock.so preauth\nauth\t[success=1 default=ignore]\tpam_unix.so nullok\nauth    [default=die]                   pam_faillock.so authfail \nauth    sufficient                      pam_faillock.so authsucc\n編輯/etc/pam.d/common-account檔案，新增以下內容：\nauth    required                        pam_faillock.so\n編輯/etc/security/faillock.conf檔案，新增或修改成以下內容：\ndeny=5",
    "expected": "5次以下，但須大於0",
    "check_cmd": "grep -c '' /etc/passwd >/dev/null 2>&1 && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 178 項"
  },
  {
    "id": "TWGCB-01-014-0179",
    "category": "帳號與存取控制",
    "name": "帳戶鎖定時間",
    "description": "這項原則設定決定使用者帳號被鎖定後的解鎖時間，以降低通行碼暴力攻擊之影響\nfail_interval=900：決定在900秒內，發生連續多次身分鑑別失敗，該帳號將被鎖定\nunlock_time=900：決定鎖定帳號後，必須經過900秒才能解除鎖定\n若解除鎖定之時間未到，可由系統管理者執行下列指令逕行解除鎖定：\n#faillock --user (使用者帳號名稱) --reset",
    "method": "編輯/etc/pam.d/common-auth檔案，新增或修改成以下內容：\nauth    required                        pam_faillock.so preauth\nauth\t[success=1 default=ignore]\tpam_unix.so nullok\nauth    [default=die]                   pam_faillock.so authfail \nauth    sufficient                      pam_faillock.so authsucc\n編輯/etc/pam.d/common-account檔案，新增以下內容：\nauth    required                        pam_faillock.so\n編輯/etc/security/faillock.conf檔案，新增或修改成以下內容：fail_interval=900\nunlock_time=900",
    "expected": "fail_interval設定900秒以下但須大於0，unlock_time設定900秒以上",
    "check_cmd": "grep -c '' /etc/passwd >/dev/null 2>&1 && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 179 項"
  },
  {
    "id": "TWGCB-01-014-0180",
    "category": "帳號與存取控制",
    "name": "強制執行通行碼歷程記錄",
    "description": "這項原則設定決定記錄幾個使用者最近使用之舊通行碼，並限制新通行碼不能與此類舊通行碼重複\n藉由限制使用者不能持續重複使用舊通行碼，令攻擊者難以猜測通行碼以提升安全性",
    "method": "編輯/etc/pam.d/common-password檔案，在pam_unix.so那行行尾新增參數「remember=3」，範例如下：\npassword [success=1 default=ignore] pam_unix.so obscure use_authtok try_first_pass remember=3",
    "expected": "3以上",
    "check_cmd": "grep -c '' /etc/passwd >/dev/null 2>&1 && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 180 項"
  },
  {
    "id": "TWGCB-01-014-0181",
    "category": "帳號與存取控制",
    "name": "系統通行碼雜湊演算法",
    "description": "這項原則設定決定系統所採用之通行碼雜湊演算法\n採用過時的雜湊演算法可能會構成系統安全風險，yescrypt是一種具高度安全性的雜湊演算法，可以增加攻擊者破解通行碼的難度，為系統提供多一層安全防護",
    "method": "編輯/etc/pam.d/common-password檔案，找到pam_unix.so所在的行，新增或修改參數「yescrypt」，範例如下：\npassword [success=1 default=ignore] pam_unix.so obscure use_authtok try_first_pass yescrypt\n編輯/etc/login.defs檔案，新增或修改ENCRYPT_METHOD參數為以下內容：\nENCRYPT_METHOD yescrypt",
    "expected": "yescrypt",
    "check_cmd": "grep -c '' /etc/passwd >/dev/null 2>&1 && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 181 項"
  },
  {
    "id": "TWGCB-01-014-0182",
    "category": "帳號與存取控制",
    "name": "使用者通行碼雜湊演算法",
    "description": "這項原則設定檢查使用者所採用之通行碼雜湊演算法與系統採用之通行碼雜湊演算法是否一致\n採用過時的雜湊演算法可能會構成系統安全風險，yescrypt是一種具高度安全性的雜湊演算法，可以增加攻擊者破解通行碼的難度，為系統提供多一層安全防護",
    "method": "開啟終端機，執行以下腳本，檢查使用者所採用之通行碼雜湊演算法與系統採用之通行碼雜湊演算法是否一致：\n#!/bin/bash\ndeclare -A HASH_MAP=( [\"y\"]=\"yescrypt\" [\"1\"]=\"md5\" [\"2\"]=\"blowfish\" [\"5\"]=\"SHA256\" [\"6\"]=\"SHA512\" [\"g\"]=\"gost-yescrypt\" )\nCONFIGURED_HASH=$(sed -n \"s/^\\s*ENCRYPT_METHOD\\s*\\(.*\\)\\s*$/\\1/p\" /etc/login.defs)\nfor MY_USER in $(sed -n \"s/^\\(.*\\):\\\\$.*/\\1/p\" /etc/shadow)\ndo\n  CURRENT_HASH=$(sed -n \"s/${MY_USER}:\\\\$\\(.\\).*/\\1/p\" /etc/shadow)\n  if [[ \"${HASH_MAP[\"${CURRENT_HASH}\"]^^}\" != \"${CONFIGURED_HASH^^}\" ]]; \n  then\n    echo \"The password for '${MY_USER}' is using '${HASH_MAP[\"${CURRENT_HASH}\"]}' instead of the configured '${CONFIGURED_HASH}'.\"\n  fi\ndone\n若存在通行碼雜湊演算法不一致之帳號，則可執行以下指令修改通行碼，並採用系統使用之通行碼雜湊演算法：\n#passwd (使用者名稱)",
    "expected": "使用者所採用之通行碼雜湊演算法與系統採用之通行碼雜湊演算法一致",
    "check_cmd": "grep -c '' /etc/passwd >/dev/null 2>&1 && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 182 項"
  },
  {
    "id": "TWGCB-01-014-0183",
    "category": "帳號與存取控制",
    "name": "通行碼最短使用期限",
    "description": "這項原則設定決定在使用者變更通行碼之前，通行碼必須使用之期限(天數)。設為0代表可隨時變更通行碼，設為-1代表停用此原則\n設定通行碼最短使用期限為1天，以避免使用者重複使用相同通行碼",
    "method": "編輯/etc/login.defs檔案，設定PASS_MIN_DAYS參數如下：\nPASS_MIN_DAYS 1\n針對進行上述設定前已存在之使用者帳號，須再執行下列指令，使該帳號之通行碼最短使用期限變更為1天：\n#chage --mindays 1 (使用者帳號名稱)",
    "expected": "1天以上",
    "check_cmd": "grep -c '' /etc/passwd >/dev/null 2>&1 && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 183 項"
  },
  {
    "id": "TWGCB-01-014-0184",
    "category": "帳號與存取控制",
    "name": "通行碼最長使用期限",
    "description": "這項原則設定決定系統要求使用者變更通行碼之前，通行碼可以使用之期限(天數)。設為-1代表停用此原則\n設定通行碼最長使用期限為90天，以提高通行碼更換頻率，增加攻擊者破解通行碼之難度",
    "method": "編輯/etc/login.defs檔案，設定PASS_MAX_DAYS參數如下：\nPASS_MAX_DAYS 90\n針對進行上述設定前已存在之使用者帳號，須再執行下列指令，才能使通行碼最長使用期限變更為90天：\n#chage --maxdays 90 (使用者帳號名稱)",
    "expected": "90天以下，但須大於0",
    "check_cmd": "grep -c '' /etc/passwd >/dev/null 2>&1 && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 184 項"
  },
  {
    "id": "TWGCB-01-014-0185",
    "category": "帳號與存取控制",
    "name": "通行碼到期前提醒使用者變更通行碼",
    "description": "這項原則設定決定在使用者通行碼即將到期時，要提前多久(天數)提醒使用者進行通行碼變更\n設定通行碼到期前14天提醒使用者，預先提供通行碼即將到期之警告，讓使用者有時間思考安全通行碼",
    "method": "編輯/etc/login.defs檔案，設定PASS_WARN_AGE參數如下：\nPASS_WARN_AGE 14\n針對進行上述設定前已存在之使用者帳號，須再執行下列指令，才能使通行碼到期前14天提醒使用者變更通行碼：\n#chage --warndays 14 (使用者帳號名稱)",
    "expected": "14天以上",
    "check_cmd": "grep -c '' /etc/passwd >/dev/null 2>&1 && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 185 項"
  },
  {
    "id": "TWGCB-01-014-0186",
    "category": "帳號與存取控制",
    "name": "通行碼到期後，帳號停用前之天數",
    "description": "這項原則設定決定使用者帳號於通行碼到期後，若超過設定天數則停用帳號\n設定通行碼到期後，超過30天即停用帳號，避免未使用帳號對系統構成威脅",
    "method": "開啟終端機，執行以下指令，設定通行碼到期後之帳號停用天數：\n#useradd -D -f 30\n針對進行上述設定前已存在之使用者帳號，須再執行下列指令，才能使通行碼到期後，超過30天即停用帳號：\n#chage --inactive 30 (使用者帳號名稱)",
    "expected": "30天以下，但須大於0",
    "check_cmd": "grep -c '' /etc/passwd >/dev/null 2>&1 && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 186 項"
  },
  {
    "id": "TWGCB-01-014-0187",
    "category": "帳號與存取控制",
    "name": "要求使用者必須經過身分鑑別才能提升權限",
    "description": "這項原則設定決定是否要求使用者必須經過身分鑑別，才能使用sudo提升權限或更換角色\n設定使用sudo提權時必須經過身分鑑別，以避免遭使用者存取未被授權之檔案或服務",
    "method": "開啟終端機，執行以下指令，尋找「NOPASSWD」或「!authenticate」：\n#egrep -i '(nopasswd|!authenticate)' /etc/sudoers /etc/sudoers.d/*\n執行「visudo -f」指令編輯/etc/sudoers檔案或 /etc/sudoers.d/目錄下之檔案，針對包含「NOPASSWD」或「!authenticate」的指令行，予以註解(#)或刪除",
    "expected": "要求身分鑑別",
    "check_cmd": "grep -c '' /etc/passwd >/dev/null 2>&1 && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 187 項"
  },
  {
    "id": "TWGCB-01-014-0188",
    "category": "帳號與存取控制",
    "name": "通行碼最後變更日期",
    "description": "這項原則設定檢查通行碼最後變更日期是否為過去之日期\n若通行碼最後變更日期為未來之日期，有可能繞過通行碼原則之驗證機制",
    "method": "開啟終端機，執行以下指令，檢查是否有通行碼最後變更日期為未來之日期：\nawk -F: '/^[^:]+:[^!*]/{print $1}' /etc/shadow | while read -r usr; \\\ndo change=$(date -d \"$(chage --list $usr | grep '^Last password change' | cut -d: -f2 | grep -v 'never$')\" +%s); \\\nif [[ \"$change\" -gt \"$(date +%s)\" ]]; then \\\necho \"User: \\\"$usr\\\" last password change was \\\"$(chage --list $usr | grep '^Last password change' | cut -d: -f2)\\\"\"; fi; done\n若有通行碼最後變更日期為未來之日期，開啟終端機，執行以下指令，變更通行碼，以更新通行碼最後變更日期\n#passwd (使用者名稱)",
    "expected": "通行碼最後變更日期皆為過去之日期",
    "check_cmd": "grep -c '' /etc/passwd >/dev/null 2>&1 && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 188 項"
  },
  {
    "id": "TWGCB-01-014-0189",
    "category": "帳號與存取控制",
    "name": "系統帳號登入方式",
    "description": "這項原則設定決定是否藉由設定nologin參數，以禁止系統帳號登入\n系統帳號是除了root外，UID小於1000之帳號，與一般使用者無關，是為了執行相關管理功能而存在於系統中\n針對系統帳號進行通行碼鎖定與設定無法登入之合法 shell(/sbin/nologin)，以增加攻擊者使用此類帳號進行攻擊之難度\n系統帳號雖無法使用bash或其他shell登入系統，但仍可使用系統資源提供服務",
    "method": "開啟終端機，執行以下指令，設定系統帳號(sync、shutdown及halt帳號除外)不可使用殼層(Shell)登入：\n#awk -F: '($1!=\"root\" && $1!=\"sync\" && $1!=\"shutdown\" && $1!=\"halt\" && $1!~/^\\+/ && $3<'\"$(awk '/^\\s*UID_MIN/{print $2}' /etc/login.defs)\"' && $7!=\"'\"$(which nologin)\"'\" && $7!=\"/bin/false\") {print $1}' /etc/passwd | while read user; do usermod -s $(which nologin) $user; done\n執行以下指令，鎖定所有非root之系統帳號：\n#awk -F: '($1!=\"root\" && $1!~/^\\+/ && $3<'\"$(awk '/^\\s*UID_MIN/{print $2}' /etc/login.defs)\"') {print $1}' /etc/passwd | xargs -I '{}' passwd -S '{}' | awk '($2!=\"L\" && $2!=\"LK\") {print $1}' | while read user; do usermod -L $user; done",
    "expected": "nologin",
    "check_cmd": "awk -F: '($3<1000 && $1!=\"root\" && $7!=\"/usr/sbin/nologin\" && $7!=\"/bin/false\"){print $1}' /etc/passwd | wc -l | grep -q '^0$' && echo PASS || echo FAIL",
    "remediation": "將系統帳號的 shell 改為 /usr/sbin/nologin"
  },
  {
    "id": "TWGCB-01-014-0190",
    "category": "帳號與存取控制",
    "name": "Bash shell閒置時登出時間",
    "description": "這項原則設定決定Bash shell閒置超過多少秒後自動登出\n當Bash shell屬於前景程序時，才會自動登出。例如，在使用vim編輯檔案並且閒置15分鐘時，自動登出並不會發生\n設定Bash shell閒置逾時時間，可提供使用者離開系統時未鎖定螢幕之防護措施，以避免其他使用者未經授權使用shell",
    "method": "編輯/etc/bash.bashrc或/etc/profile或/etc/profile.d/目錄下的「.sh」檔案，新增或修改參數如下：readonly TMOUT=900 ; export TMOUT",
    "expected": "900秒以下，但須大於0",
    "check_cmd": "grep -c '' /etc/passwd >/dev/null 2>&1 && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 190 項"
  },
  {
    "id": "TWGCB-01-014-0191",
    "category": "帳號與存取控制",
    "name": "root帳號所屬群組",
    "description": "這項原則設定決定是否檢查root帳號所屬群組\nusermod指令可用於指定root帳號所屬群組，這會影響root管理者所建立檔案的權限\nroot帳號所屬群組使用GID 0，有助於防止一般使用者意外存取root帳號所擁有之檔案",
    "method": "開啟終端機，執行以下指令，設定root帳號所屬群組：\n#usermod -g 0 root",
    "expected": "GID 0",
    "check_cmd": "grep -c '' /etc/passwd >/dev/null 2>&1 && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 191 項"
  },
  {
    "id": "TWGCB-01-014-0192",
    "category": "帳號與存取控制",
    "name": "所有使用者帳號之預設umask",
    "description": "這項原則設定決定是否在/etc/profile中設定所有使用者帳號之預設umask，用以指定新建立檔案之預設權限\numask設為027，表示使用者所建立之檔案，擁有者可讀取、寫入及執行，群組可讀取及執行，其他使用者無讀取、寫入及執行權限\numask第1個位元代表擁有者，第2個位元代表群組，第3個位元代表其他使用者，設定值說明如下：\n0：可讀取、寫入及執行\n1：不可執行\n2：不可寫入\n3：不可寫入與執行\n4：不可讀取\n5：不可讀取與執行\n6：不可讀取與寫入\n7：不可讀取、寫入及執行",
    "method": "編輯/etc/profile檔案、/etc/profile.d/目錄下的「.sh」檔案及/etc/bash.bashrc檔案，新增或修改參數如下：\numask 027",
    "expected": "027或更低權限",
    "check_cmd": "grep -c '' /etc/passwd >/dev/null 2>&1 && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 192 項"
  },
  {
    "id": "TWGCB-01-014-0193",
    "category": "帳號與存取控制",
    "name": "可使用su指令之群組",
    "description": "這項原則設定決定是否設定sugroup群組，並限制僅sugroup群組內之使用者才能使用su指令\nsu指令可以完全被sudo指令取代，同時允許更精細的特權帳號存取控制\nsu指令允許使用者以其他使用者身分執行指令或shell，預設情況下任何使用者皆可執行su指令，透過啟用/etc/pam.d/su檔案之pam_wheel.so設定，將僅允許sugroup群組中之用戶執行su指令，有利於系統管理者控管使用者提升特權行為",
    "method": "開啟終端機，執行以下指令新增sugroup群組\ngroupadd sugroup\n開啟終端機，執行vim指令，編輯「/etc/pam.d/su」檔案，設定僅sugroup群組的成員才能執行su指令：\nauth required pam_wheel.so use_uid group=sugroup",
    "expected": "僅限sugroup群組才能使用su指令",
    "check_cmd": "grep -c '' /etc/passwd >/dev/null 2>&1 && echo PASS || echo FAIL",
    "remediation": "請參閱 TWGCB-01-014 說明文件第 193 項"
  },
  {
    "id": "TWGCB-01-014-0194",
    "category": "Chrony配置",
    "name": "chrony校時套件",
    "description": "這項原則設定決定是否安裝chrony校時套件\nchrony是一個守護程序，藉由實作網路時間協定(NTP)，以於各系統之間同步系統時間，並可使用高準確之校時來源",
    "method": "開啟終端機，執行以下指令，安裝chrony校時套件，並移除其他校時套件：\n#apt install chrony\n#systemctl --now mask systemd-timesyncd.service\n#apt purge ntp",
    "expected": "安裝",
    "check_cmd": "dpkg -s chrony 2>/dev/null | grep -q 'Status: install ok installed' && echo PASS || echo FAIL",
    "remediation": "開啟終端機，執行以下指令，安裝chrony校時套件，並移除其他校時套件：\n#apt install chrony\n#systemctl --now mask systemd-timesyncd.service\n#apt purge ntp"
  },
  {
    "id": "TWGCB-01-014-0195",
    "category": "Chrony配置",
    "name": "chrony校時設定",
    "description": "這項原則設定決定是否設定chrony守護程序之校時來源\n設定chrony校時來源，以確保系統時間正確",
    "method": "編輯/etc/chrony.conf檔案，新增或修改校時伺服器設定，範例如下：\nserver (NTP校時伺服器名稱)\n或\npool (NTP池名稱)\n開啟終端機，執行以下指令重新啟動chrony服務：\n#systemctl restart chrony",
    "expected": "設定1個以上校時來源",
    "check_cmd": "grep -qE '^(server|pool)' /etc/chrony/chrony.conf 2>/dev/null && echo PASS || echo FAIL",
    "remediation": "編輯/etc/chrony.conf檔案，新增或修改校時伺服器設定，範例如下：\nserver (NTP校時伺服器名稱)\n或\npool (NTP池名稱)\n開啟終端機，執行以下指令重新啟動chrony服務：\n#systemctl restart chrony"
  },
  {
    "id": "TWGCB-01-014-0196",
    "category": "Chrony配置",
    "name": "chrony校時使用者設定",
    "description": "這項原則設定chrony守護程序之使用者帳戶\nchrony套件在安裝的同時，新增了一個系統帳戶_chrony，該帳戶被授予chrony服務所需之必要權限\n設置chrony服務透過_chrony帳戶運行，避免給予chrony服務過高權限",
    "method": "編輯/etc/chrony/chrony.conf檔案，新增或修改校時伺服器使用者設定：\nuser _chrony\n開啟終端機，執行以下指令重新啟動chrony服務：\n#systemctl restart chrony",
    "expected": "_chrony",
    "check_cmd": "grep -qE '^user ' /etc/chrony/chrony.conf 2>/dev/null && grep -v 'root' /etc/chrony/chrony.conf | grep -q 'user' && echo PASS || echo FAIL",
    "remediation": "編輯/etc/chrony/chrony.conf檔案，新增或修改校時伺服器使用者設定：\nuser _chrony\n開啟終端機，執行以下指令重新啟動chrony服務：\n#systemctl restart chrony"
  },
  {
    "id": "TWGCB-01-014-0197",
    "category": "Chrony配置",
    "name": "chrony校時服務",
    "description": "這項原則設定決定是否啟用chrony服務\n建議啟用校時服務，以確保系統時間準確性",
    "method": "開啟終端機，執行以下指令，啟用chrony服務：\n#systemctl --now enable chrony",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled chrony 2>/dev/null | grep -q 'enabled' && echo PASS || echo FAIL",
    "remediation": "開啟終端機，執行以下指令，啟用chrony服務：\n#systemctl --now enable chrony"
  },
  {
    "id": "TWGCB-01-014-0198",
    "category": "systemd-timesyncd配置",
    "name": "systemd-timesyncd校時套件",
    "description": "這項原則設定決定是否安裝systemd-timesyncd校時套件\nsystemd-timesyncd是一個守護程序，藉由實作網路時間協定(NTP)，以於各系統之間同步系統時間，並可使用高準確之校時來源\nsystemd-timesyncd套件隨作業系統一併安裝，如果系統同時啟用其他校時服務(如Chrony與NTP等)，可能導致systemd-timesyncd服務無法正常運作",
    "method": "開啟終端機，執行以下指令，移除其他校時套件：\n#apt purge chrony\n#apt purge ntp",
    "expected": "安裝",
    "check_cmd": "dpkg -s systemd-timesyncd 2>/dev/null | grep -q 'Status: install ok installed' && echo PASS || echo FAIL",
    "remediation": "開啟終端機，執行以下指令，移除其他校時套件：\n#apt purge chrony\n#apt purge ntp"
  },
  {
    "id": "TWGCB-01-014-0199",
    "category": "systemd-timesyncd配置",
    "name": "systemd-timesyncd校時設定",
    "description": "這項原則設定決定是否設定systemd-timesyncd守護程序之校時來源\n設定systemd-timesyncd校時來源，以確保系統時間正確",
    "method": "編輯/etc/systemd/timesyncd.conf檔案，新增或修改校時伺服器設定，範例如下：\n[Time]\nNTP=(NTP校時伺服器名稱) \n開啟終端機，執行以下指令重新啟動 systemd-timesyncd服務：\n#systemctl restart systemd-timesyncd",
    "expected": "設定1個以上校時來源",
    "check_cmd": "grep -qE '^NTP=' /etc/systemd/timesyncd.conf 2>/dev/null && echo PASS || echo FAIL",
    "remediation": "編輯/etc/systemd/timesyncd.conf檔案，新增或修改校時伺服器設定，範例如下：\n[Time]\nNTP=(NTP校時伺服器名稱) \n開啟終端機，執行以下指令重新啟動 systemd-timesyncd服務：\n#systemctl restart systemd-timesyncd"
  },
  {
    "id": "TWGCB-01-014-0200",
    "category": "systemd-timesyncd配置",
    "name": "systemd-timesyncd校時服務",
    "description": "這項原則設定決定是否啟用systemd-timesyncd服務\n建議啟用校時服務，以確保系統時間準確性",
    "method": "開啟終端機，執行以下指令，啟用systemd-timesyncd服務：\n#systemctl --now enable systemd-timesyncd",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled systemd-timesyncd 2>/dev/null | grep -q 'enabled' && echo PASS || echo FAIL",
    "remediation": "開啟終端機，執行以下指令，啟用systemd-timesyncd服務：\n#systemctl --now enable systemd-timesyncd"
  },
  {
    "id": "TWGCB-01-014-0201",
    "category": "NTP配置",
    "name": "ntp校時套件",
    "description": "這項原則設定決定是否安裝ntp校時套件\nntp是一個守護程序，藉由實作網路時間協定(NTP)，以於各系統之間同步系統時間，並可使用高準確之校時來源",
    "method": "開啟終端機，執行以下指令，安裝ntp校時套件，並移除其他校時套件：\n#apt install ntp\n#systemctl --now mask systemd-timesyncd.service\n#apt purge chrony",
    "expected": "安裝",
    "check_cmd": "dpkg -s ntp 2>/dev/null | grep -q 'Status: install ok installed' && echo PASS || echo FAIL",
    "remediation": "開啟終端機，執行以下指令，安裝ntp校時套件，並移除其他校時套件：\n#apt install ntp\n#systemctl --now mask systemd-timesyncd.service\n#apt purge chrony"
  },
  {
    "id": "TWGCB-01-014-0202",
    "category": "NTP配置",
    "name": "ntp校時設定",
    "description": "這項原則設定決定是否設定ntp守護程序之校時來源\n設定ntp校時來源，以確保系統時間正確",
    "method": "編輯/etc/ntp.conf檔案，新增或修改校時伺服器設定，範例如下：\nserver (NTP校時伺服器名稱)\n或\npool (NTP池名稱)\n開啟終端機，執行以下指令重新啟動ntp：\n#systemctl restart ntp",
    "expected": "設定1個以上校時來源",
    "check_cmd": "grep -qE '^(server|pool)' /etc/ntp.conf 2>/dev/null && echo PASS || echo FAIL",
    "remediation": "編輯/etc/ntp.conf檔案，新增或修改校時伺服器設定，範例如下：\nserver (NTP校時伺服器名稱)\n或\npool (NTP池名稱)\n開啟終端機，執行以下指令重新啟動ntp：\n#systemctl restart ntp"
  },
  {
    "id": "TWGCB-01-014-0203",
    "category": "NTP配置",
    "name": "ntp校時使用者設定",
    "description": "這項原則設定ntp守護程序之使用者帳戶\nntp套件在安裝的同時，新增了一個系統帳戶ntp，該帳戶被授予ntp服務所需之必要權限\n設置ntp服務透過ntp帳戶運行，避免給予ntp服務過高權限",
    "method": "編輯/etc/init.d/ntp檔案，新增或修改NTP伺服器使用者設定：RUNASUSER=ntp\n開啟終端機，執行以下指令重新啟動ntp：\n#systemctl restart ntp",
    "expected": "ntp",
    "check_cmd": "grep -qE '^user ' /etc/ntp.conf 2>/dev/null && grep -v 'root' /etc/ntp.conf | grep -q 'user' && echo PASS || echo FAIL",
    "remediation": "編輯/etc/init.d/ntp檔案，新增或修改NTP伺服器使用者設定：RUNASUSER=ntp\n開啟終端機，執行以下指令重新啟動ntp：\n#systemctl restart ntp"
  },
  {
    "id": "TWGCB-01-014-0204",
    "category": "NTP配置",
    "name": "ntp校時服務",
    "description": "這項原則設定決定是否啟用ntp服務\n建議啟用校時服務，以確保系統時間準確性",
    "method": "開啟終端機，執行以下指令，啟用ntp服務：\n#systemctl --now enable ntp",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled ntp 2>/dev/null | grep -q 'enabled' && echo PASS || echo FAIL",
    "remediation": "開啟終端機，執行以下指令，啟用ntp服務：\n#systemctl --now enable ntp"
  },
  {
    "id": "TWGCB-01-014-0205",
    "category": "UFW配置",
    "name": "ufw防火牆套件",
    "description": "這項原則設定決定是否安裝ufw防火牆套件\n藉由防火牆管理與設定，以保護系統安全",
    "method": "開啟終端機，執行以下指令，安裝ufw防火牆套件：\n#apt install ufw",
    "expected": "安裝",
    "check_cmd": "dpkg -s ufw 2>/dev/null | grep -q 'Status: install ok installed' && echo PASS || echo FAIL",
    "remediation": "開啟終端機，執行以下指令，安裝ufw防火牆套件：\n#apt install ufw"
  },
  {
    "id": "TWGCB-01-014-0206",
    "category": "UFW配置",
    "name": "iptables-persistent套件",
    "description": "這項原則設定決定是否安裝iptables-persistent套件\niptables-persistent套件為iptables之外掛程式，用於開機期間載入netfilter規則\n同時運行ufw與iptables-persistent服務，可能因彼此間之規則衝突導致系統運作異常或產生資安風險，因此在使用ufw時，建議移除iptables-persistent套件",
    "method": "開啟終端機，執行以下指令，移除iptables-persistent套件： \n#apt purge iptables-persistent",
    "expected": "移除",
    "check_cmd": "dpkg -s iptables-persistent 2>/dev/null | grep -q 'Status: install ok installed' && echo PASS || echo FAIL",
    "remediation": "開啟終端機，執行以下指令，移除iptables-persistent套件： \n#apt purge iptables-persistent"
  },
  {
    "id": "TWGCB-01-014-0207",
    "category": "UFW配置",
    "name": "ufw服務",
    "description": "這項原則設定決定是否啟用ufw服務\n建議啟用防火牆服務，以保護系統安全",
    "method": "開啟終端機，執行以下指令，啟用ufw服務：\n#systemctl --now enable ufw",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled ufw 2>/dev/null | grep -q 'enabled' && echo PASS || echo FAIL",
    "remediation": "開啟終端機，執行以下指令，啟用ufw服務：\n#systemctl --now enable ufw"
  },
  {
    "id": "TWGCB-01-014-0208",
    "category": "UFW配置",
    "name": "在ufw設定回送流量規則",
    "description": "這項原則設定決定是否在ufw設定回送流量(loopback traffic)規則\n設定回送介面接受回送網路流量，並設定其他介面拒絕回送網路(127.0.0.0/8與::1)的流量\n回送網路流量是同一台電腦中程序彼此之間通訊所產生之流量，對於系統運作至關重要\n設定僅回送介面可接受回送網路流量，且所有其他介面都應忽略回送網路流量，以協助防止偽冒攻擊",
    "method": "開啟終端機，執行以下指令，新增回送流量規則：\n#ufw allow in on lo\n#ufw allow out on lo\n#ufw deny in from 127.0.0.0/8\n#ufw deny in from ::1",
    "expected": "建立回送流量規則",
    "check_cmd": "ufw status verbose 2>/dev/null | grep -q 'Anywhere on lo' && echo PASS || echo FAIL",
    "remediation": "開啟終端機，執行以下指令，新增回送流量規則：\n#ufw allow in on lo\n#ufw allow out on lo\n#ufw deny in from 127.0.0.0/8\n#ufw deny in from ::1"
  },
  {
    "id": "TWGCB-01-014-0209",
    "category": "UFW配置",
    "name": "在ufw建立預設拒絕規則",
    "description": "這項原則設定決定是否在ufw建立預設拒絕規則\n所建立之預設規則，會套用在已通過其他規則並到達鏈尾端之封包，該規則可設為允許(allow)或拒絕(deny)\n將預設規則設為拒絕，以防止惡意封包通過防火牆，進而影響系統安全",
    "method": "開啟終端機，執行以下指令，針對輸入、輸出及路由政策，建立預設拒絕規則：\n#ufw default deny incoming\n#ufw default deny outgoing\n#ufw default deny routed",
    "expected": "deny",
    "check_cmd": "ufw status verbose 2>/dev/null | grep -qiE 'deny.*anywhere|reject.*anywhere' && echo PASS || echo FAIL",
    "remediation": "開啟終端機，執行以下指令，針對輸入、輸出及路由政策，建立預設拒絕規則：\n#ufw default deny incoming\n#ufw default deny outgoing\n#ufw default deny routed"
  },
  {
    "id": "TWGCB-01-014-0210",
    "category": "Nftables配置",
    "name": "nftables防火牆套件",
    "description": "這項原則設定決定是否安裝nftables防火牆套件\n藉由防火牆管理與設定，以保護系統安全",
    "method": "開啟終端機，執行以下指令，安裝nftables防火牆套件：\n#apt install nftables",
    "expected": "安裝",
    "check_cmd": "dpkg -s nftables 2>/dev/null | grep -q 'Status: install ok installed' && echo PASS || echo FAIL",
    "remediation": "開啟終端機，執行以下指令，安裝nftables防火牆套件：\n#apt install nftables"
  },
  {
    "id": "TWGCB-01-014-0211",
    "category": "Nftables配置",
    "name": "ufw套件",
    "description": "這項原則設定決定是否安裝ufw防火牆套件\n同時運行nftables與ufw服務，可能因彼此間之規則衝突導致系統運作異常或產生資安風險，因此在使用nftables時，建議移除ufw套件",
    "method": "開啟終端機，執行以下指令，移除ufw套件： \n#apt purge ufw",
    "expected": "移除",
    "check_cmd": "dpkg -s ufw 2>/dev/null | grep -qv 'Status: install ok installed' && echo PASS || echo FAIL",
    "remediation": "開啟終端機，執行以下指令，移除ufw套件： \n#apt purge ufw"
  },
  {
    "id": "TWGCB-01-014-0212",
    "category": "Nftables配置",
    "name": "nftables服務",
    "description": "這項原則設定決定是否啟用nftables服務\nnftables為iptables後繼產品，屬於Linux核心子系統，提供對網路封包(Packets)、資料包(Datagram)及訊框(Frame)進行過濾與分類功能\n建議啟用防火牆服務，以保護系統安全",
    "method": "開啟終端機，執行以下指令，啟用nftables服務： \n#systemctl --now enable nftables",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled nftables 2>/dev/null | grep -q 'enabled' && echo PASS || echo FAIL",
    "remediation": "開啟終端機，執行以下指令，啟用nftables服務： \n#systemctl --now enable nftables"
  },
  {
    "id": "TWGCB-01-014-0213",
    "category": "Nftables配置",
    "name": "在nftables中建立表",
    "description": "這項原則設定決定是否在nftables中建立至少1個表(Tables)\nnftables預設不存在表，表為鏈(Chains)的容器，必須建立表，後續才能建立與保存鏈\n每個表必須定義一個位址族(Address family)，位址族選項如下：\nip：IPv4位址族，處理IPv4封包\nip6：IPv6位址族，處理IPv6封包\ninet：IPv4/IPv6位址族，可同時處理IPv4/IPv6封包\narp：ARP位址族，處理IPv4 ARP封包\nbridge：Bridge位址族，處理橋接封包\nnetdev：Netdev位址族，處理入口封包",
    "method": "開啟終端機，執行以下指令，在nftables建立表：\n#nft create table inet (表名稱)\n建立一個使用「inet」位址族且表名稱為「filter」之範例如下：\n#nft create table inet filter",
    "expected": "1個以上",
    "check_cmd": "nft list tables 2>/dev/null | grep -q . && echo PASS || echo FAIL",
    "remediation": "開啟終端機，執行以下指令，在nftables建立表：\n#nft create table inet (表名稱)\n建立一個使用「inet」位址族且表名稱為「filter」之範例如下：\n#nft create table inet filter"
  },
  {
    "id": "TWGCB-01-014-0214",
    "category": "Nftables配置",
    "name": "在nftables建立基本鏈",
    "description": "這項原則設定決定是否在nftables建立至少1個基本鏈(Base chains)\nnftables預設不存在表，在nftables建立表後才能建立鏈，鏈為規則(Rules)的容器，必須建立鏈，後續才能建立與保存規則\n建立輸入(input)、轉發(forward)及輸出(output)之基本鏈，以使用nftables進行網路封包過濾",
    "method": "開啟終端機，執行以下指令，在nftables建立基本鏈：\n#nft create chain inet (表名稱) (鏈名稱) { type filter hook (input|forward|output) priority 0 \\; }\n在「filter」表中建立基本鏈之範例如下：\n#nft create chain inet filter input { type filter hook input priority 0 \\; }\n#nft create chain inet filter forward { type filter hook forward priority 0 \\; }\n#nft create chain inet filter output { type filter hook output priority 0 \\; }",
    "expected": "1個以上",
    "check_cmd": "nft list ruleset 2>/dev/null | grep -qE 'chain (input|output|forward)' && echo PASS || echo FAIL",
    "remediation": "開啟終端機，執行以下指令，在nftables建立基本鏈：\n#nft create chain inet (表名稱) (鏈名稱) { type filter hook (input|forward|output) priority 0 \\; }\n在「filter」表中建立基本鏈之範例如下：\n#nft create chain inet filter input { type filter hook input priority 0 \\; }\n#nft create chain inet filter forward { type filter hook forward priority 0 \\; }\n#nft create chain inet filter output { type filter hook output priority 0 \\; }"
  },
  {
    "id": "TWGCB-01-014-0215",
    "category": "Nftables配置",
    "name": "在nftables設定回送流量規則",
    "description": "這項原則設定決定是否在nftables設定回送流量(loopback traffic)規則\n設定回送介面接受回送網路流量，並設定其他介面拒絕回送網路(127.0.0.0/8與::1)的流量\n回送網路流量是同一台電腦中程序彼此之間通訊所產生之流量，對於系統運作至關重要\n設定僅回送介面可接受回送網路流量，且所有其他介面都應忽略回送網路流量，以協助防止偽冒攻擊",
    "method": "開啟終端機，執行以下指令，在「filter」表中設定「lo」介面之回送流量規則：\n#nft add rule inet filter input iif lo accept\n#nft add rule inet filter input ip saddr 127.0.0.0/8 counter drop\n#nft add rule inet filter input ip6 saddr ::1 counter drop",
    "expected": "建立回送流量規則",
    "check_cmd": "nft list ruleset 2>/dev/null | grep -q 'lo' && echo PASS || echo FAIL",
    "remediation": "開啟終端機，執行以下指令，在「filter」表中設定「lo」介面之回送流量規則：\n#nft add rule inet filter input iif lo accept\n#nft add rule inet filter input ip saddr 127.0.0.0/8 counter drop\n#nft add rule inet filter input ip6 saddr ::1 counter drop"
  },
  {
    "id": "TWGCB-01-014-0216",
    "category": "Nftables配置",
    "name": "在nftables建立預設拒絕規則",
    "description": "這項原則設定決定是否在nftables建立預設拒絕規則\n所建立之預設規則，會套用在已通過其他規則並到達鏈尾端之封包，該規則可設為接受(accept)或丟棄(drop)\n將預設拒絕規則設為丟棄，將到達鏈尾端之封包丟棄，以防止惡意封包通過防火牆，進而影響系統安全",
    "method": "開啟終端機，執行以下指令，針對輸入、轉發及輸出的基本鏈，建立預設拒絕規則：\n#nft chain (位址族) (表名稱) (鏈名稱) { policy drop \\; }\n在位址族「inet」與表「filter」下，建立input、forward及output基本鏈預設拒絕規則，範例如下：\n#nft chain inet filter input { policy drop \\; }\n#nft chain inet filter forward { policy drop \\; }\n#nft chain inet filter output { policy drop \\; }",
    "expected": "Drop",
    "check_cmd": "nft list ruleset 2>/dev/null | grep -qE 'drop|reject' && echo PASS || echo FAIL",
    "remediation": "開啟終端機，執行以下指令，針對輸入、轉發及輸出的基本鏈，建立預設拒絕規則：\n#nft chain (位址族) (表名稱) (鏈名稱) { policy drop \\; }\n在位址族「inet」與表「filter」下，建立input、forward及output基本鏈預設拒絕規則，範例如下：\n#nft chain inet filter input { policy drop \\; }\n#nft chain inet filter forward { policy drop \\; }\n#nft chain inet filter output { policy drop \\; }"
  },
  {
    "id": "TWGCB-01-014-0217",
    "category": "Nftables配置",
    "name": "載入nftables規則",
    "description": "這項原則設定決定是否設定開機即載入nftables規則，使得系統運作期間，所設定之規則皆發揮作用，以保護系統安全\nnftables服務藉由讀取/etc/sysconfig/nftables.conf設定檔所引入之路徑，以載入nftables規則集，nftables規則集包含輸入、轉發及輸出之基本鏈，以執行網路封包過濾",
    "method": "開啟終端機，執行vim指令，編輯/etc/sysconfig/nftables.conf檔案，範例如下：\n#vim /etc/sysconfig/nftables.conf\n將檔案中包含include參數的行內容取消註解(刪除行首的#符號)，以設定在服務啟動時載入nftables規則集，範例如下：\ninclude \"/etc/nftables/main.nft\"",
    "expected": "開機時自動載入nftables規則集",
    "check_cmd": "nft list ruleset 2>/dev/null | grep -q . && echo PASS || echo FAIL",
    "remediation": "開啟終端機，執行vim指令，編輯/etc/sysconfig/nftables.conf檔案，範例如下：\n#vim /etc/sysconfig/nftables.conf\n將檔案中包含include參數的行內容取消註解(刪除行首的#符號)，以設定在服務啟動時載入nftables規則集，範例如下：\ninclude \"/etc/nftables/main.nft\""
  },
  {
    "id": "TWGCB-01-014-0218",
    "category": "Iptables配置",
    "name": "iptables防火牆套件",
    "description": "這項原則設定決定是否安裝iptables防火牆套件\n藉由防火牆管理與設定，以保護系統安全",
    "method": "開啟終端機，執行以下指令，安裝iptables防火牆套件：\n#apt install iptables iptables-persistent",
    "expected": "安裝",
    "check_cmd": "dpkg -s iptables 2>/dev/null | grep -q 'Status: install ok installed' && echo PASS || echo FAIL",
    "remediation": "開啟終端機，執行以下指令，安裝iptables防火牆套件：\n#apt install iptables iptables-persistent"
  },
  {
    "id": "TWGCB-01-014-0219",
    "category": "Iptables配置",
    "name": "nftables套件",
    "description": "這項原則設定決定是否安裝nftables防火牆套件\n同時運行iptables與nftables服務，可能因彼此間之規則衝突導致系統運作異常或產生資安風險，因此在使用iptables時，建議移除nftables套件",
    "method": "開啟終端機，執行以下指令，移除nftables防火牆套件：\n#apt purge nftables",
    "expected": "移除",
    "check_cmd": "dpkg -s nftables 2>/dev/null | grep -qv 'Status: install ok installed' && echo PASS || echo FAIL",
    "remediation": "開啟終端機，執行以下指令，移除nftables防火牆套件：\n#apt purge nftables"
  },
  {
    "id": "TWGCB-01-014-0220",
    "category": "Iptables配置",
    "name": "ufw套件",
    "description": "這項原則設定決定是否安裝ufw防火牆套件\n同時運行iptables與ufw服務，可能因彼此間之規則衝突導致系統運作異常或產生資安風險，因此在使用iptables時，建議移除ufw套件",
    "method": "開啟終端機，執行以下指令，移除ufw防火牆套件：\n#apt purge ufw",
    "expected": "移除",
    "check_cmd": "dpkg -s ufw 2>/dev/null | grep -qv 'Status: install ok installed' && echo PASS || echo FAIL",
    "remediation": "開啟終端機，執行以下指令，移除ufw防火牆套件：\n#apt purge ufw"
  },
  {
    "id": "TWGCB-01-014-0221",
    "category": "Iptables配置",
    "name": "iptables服務",
    "description": "這項原則設定決定是否啟用iptables服務\niptables為Linux作業系統本機端防火牆，藉由控制Linux核心之netfilter模組，進行封包過濾與處理\n建議啟用防火牆服務，以保護系統安全",
    "method": "開啟終端機，執行以下指令，啟用iptables服務： \n#systemctl --now enable iptables",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled iptables 2>/dev/null | grep -q 'enabled' && echo PASS || echo FAIL",
    "remediation": "開啟終端機，執行以下指令，啟用iptables服務： \n#systemctl --now enable iptables"
  },
  {
    "id": "TWGCB-01-014-0222",
    "category": "Iptables配置",
    "name": "ip6tables服務",
    "description": "這項原則設定決定是否啟用ip6tables服務\nIp6tables為Linux作業系統本機端防火牆，藉由控制Linux核心之netfilter模組，進行封包過濾與處理\n建議啟用防火牆服務，以保護系統安全",
    "method": "開啟終端機，執行以下指令，啟用ip6tables服務： \n#systemctl --now enable ip6tables",
    "expected": "啟用",
    "check_cmd": "systemctl is-enabled ip6tables 2>/dev/null | grep -q 'enabled' && echo PASS || echo FAIL",
    "remediation": "開啟終端機，執行以下指令，啟用ip6tables服務： \n#systemctl --now enable ip6tables"
  },
  {
    "id": "TWGCB-01-014-0223",
    "category": "Iptables配置",
    "name": "在iptables建立預設拒絕規則",
    "description": "這項原則設定決定是否在iptables建立預設拒絕規則\n建立預設拒絕規則，以防止惡意封包通過防火牆，進而影響系統安全\n注意：建立預設拒絕規則前，請依系統維運與管理需求建立允許連線規則，並於啟用此項設定後，確認各項系統服務正常運作",
    "method": "開啟終端機，執行以下指令，針對輸入、轉發及輸出，建立iptables預設拒絕規則：\n#iptables -P INPUT DROP\n#iptables -P OUTPUT DROP\n#iptables -P FORWARD DROP",
    "expected": "Drop",
    "check_cmd": "iptables -L INPUT --line-numbers 2>/dev/null | grep -qiE 'DROP|REJECT' && echo PASS || echo FAIL",
    "remediation": "開啟終端機，執行以下指令，針對輸入、轉發及輸出，建立iptables預設拒絕規則：\n#iptables -P INPUT DROP\n#iptables -P OUTPUT DROP\n#iptables -P FORWARD DROP"
  },
  {
    "id": "TWGCB-01-014-0224",
    "category": "Iptables配置",
    "name": "在iptables設定回送流量規則",
    "description": "這項原則設定決定是否在iptables設定回送流量規則\n設定回送介面接受回送網路流量，並設定其他介面拒絕回送網路(127.0.0.0/8)之流量\n回送網路流量是同一台電腦中程序彼此之間通訊所產生之流量，對於系統運作至關重要\n設定僅回送介面可接受回送網路流量，且所有其他介面都應忽略回送網路流量，以協助防止偽冒攻擊",
    "method": "開啟終端機，執行以下指令，實施iptables回送流量規則\n#iptables -A INPUT -i lo -j ACCEPT\n#iptables -A OUTPUT -o lo -j ACCEPT\n#iptables -A INPUT -s 127.0.0.0/8 -j DROP",
    "expected": "建立回送流量規則",
    "check_cmd": "iptables -L INPUT 2>/dev/null | grep -qE 'ACCEPT.*lo|all.*127\\.0\\.0\\.1' && echo PASS || echo FAIL",
    "remediation": "開啟終端機，執行以下指令，實施iptables回送流量規則\n#iptables -A INPUT -i lo -j ACCEPT\n#iptables -A OUTPUT -o lo -j ACCEPT\n#iptables -A INPUT -s 127.0.0.0/8 -j DROP"
  },
  {
    "id": "TWGCB-01-014-0225",
    "category": "Iptables配置",
    "name": "在ip6tables建立預設拒絕規則",
    "description": "這項原則設定決定是否在ip6tables建立預設拒絕規則\n建立預設拒絕規則，以防止惡意封包通過防火牆，進而影響系統安全\n注意：建立預設拒絕規則前，請依系統維運與管理需求建立允許連線規則，並於啟用此項設定後，確認各項系統服務正常運作",
    "method": "開啟終端機，執行以下指令，針對輸入、轉發及輸出，建立ip6tables預設拒絕規則：\n# ip6tables -P INPUT DROP\n# ip6tables -P OUTPUT DROP\n# ip6tables -P FORWARD DROP",
    "expected": "Drop",
    "check_cmd": "ip6tables -L INPUT --line-numbers 2>/dev/null | grep -qiE 'DROP|REJECT' && echo PASS || echo FAIL",
    "remediation": "開啟終端機，執行以下指令，針對輸入、轉發及輸出，建立ip6tables預設拒絕規則：\n# ip6tables -P INPUT DROP\n# ip6tables -P OUTPUT DROP\n# ip6tables -P FORWARD DROP"
  },
  {
    "id": "TWGCB-01-014-0226",
    "category": "Iptables配置",
    "name": "在ip6tables設定回送流量規則",
    "description": "這項原則設定決定是否在IPv6 iptables設定回送流量規則\n設定回送介面接受回送網路流量，並設定其他介面拒絕回送網路(::1)的流量\n回送網路流量是同一台電腦中程序彼此之間通訊所產生之流量，對於系統運作至關重要\n設定僅回送介面可接受回送網路流量，且所有其他介面都應忽略回送網路流量，以協助防止偽冒攻擊",
    "method": "開啟終端機，執行以下指令，建立ip6tables回送流量規則：\n# ip6tables -A INPUT -i lo -j ACCEPT\n# ip6tables -A OUTPUT -o lo -j ACCEPT\n# ip6tables -A INPUT -s ::1 -j DROP",
    "expected": "建立回送流量規則",
    "check_cmd": "ip6tables -L INPUT 2>/dev/null | grep -qE 'ACCEPT.*lo|all.*::1' && echo PASS || echo FAIL",
    "remediation": "開啟終端機，執行以下指令，建立ip6tables回送流量規則：\n# ip6tables -A INPUT -i lo -j ACCEPT\n# ip6tables -A OUTPUT -o lo -j ACCEPT\n# ip6tables -A INPUT -s ::1 -j DROP"
  },
  {
    "id": "TWGCB-01-014-0227",
    "category": "GNOME設定",
    "name": "GNOME使用者清單",
    "description": "這項原則設定決定是否啟用使用者清單(disable-user-list)選項\n使用者清單選項控制是否在登入頁面上顯示使用者列表\n停用使用者清單選項可避免攻擊者透過使用者清單輕易取得使用者名稱",
    "method": "編輯/etc/dconf/profile/gdm檔案，新增或修改成以下內容：\nuser-db:user\nsystem-db:gdm\nfile-db:/usr/share/gdm/greeter-dconf-defaults\n開啟終端機，執行以下指令，新增/etc/dconf/db/gdm.d資料夾：\nmkdir /etc/dconf/db/gdm.d/\n編輯/etc/dconf/db/gdm.d/00-login-screen檔案，新增或修改成以下內容：\n[org/gnome/login-screen]\ndisable-user-list=true\n開啟終端機，執行以下指令，使設定檔生效：\ndconf update",
    "expected": "true",
    "check_cmd": "gsettings get org.gnome.login-screen disable-user-list 2>/dev/null | grep -q 'true' && echo PASS || echo FAIL",
    "remediation": "編輯/etc/dconf/profile/gdm檔案，新增或修改成以下內容：\nuser-db:user\nsystem-db:gdm\nfile-db:/usr/share/gdm/greeter-dconf-defaults\n開啟終端機，執行以下指令，新增/etc/dconf/db/gdm.d資料夾：\nmkdir /etc/dconf/db/gdm.d/\n編輯/etc/dconf/db/gdm.d/00-login-screen檔案，新增或修改成以下內容：\n[org/gnome/login-screen]\ndisable-user-list=true\n開啟終端機，執行以下指令，使設定檔生效：\ndconf update"
  },
  {
    "id": "TWGCB-01-014-0228",
    "category": "GNOME設定",
    "name": "GNOME使用者會談逾時時間",
    "description": "這項原則設定GNOME使用者會談逾時時間，超過逾時時間系統將鎖定該會談\n設定使用者會談逾時時間，提供使用者離開系統而未登出之防護措施，必須重新進行身分鑑別才能解除鎖定登入系統",
    "method": "編輯/etc/dconf/profile/user檔案，新增或修改成以下內容：\nuser-db:user\nsystem-db:local\n開啟終端機，執行以下指令，新增/etc/dconf/db/local.d資料夾：\nmkdir /etc/dconf/db/local.d/\n編輯/etc/dconf/db/local.d/00-screensaver檔案，新增或修改成以下內容：\n[org/gnome/desktop/session]\nidle-delay=uint32 900\n[org/gnome/desktop/screensaver]\nlock-delay=uint32 0\n開啟終端機，執行以下指令，使設定檔生效：#dconf update",
    "expected": "900秒以下，但須大於0",
    "check_cmd": "gsettings get org.gnome.desktop.session idle-delay 2>/dev/null | grep -qvE '^uint32 0$' && echo PASS || echo FAIL",
    "remediation": "編輯/etc/dconf/profile/user檔案，新增或修改成以下內容：\nuser-db:user\nsystem-db:local\n開啟終端機，執行以下指令，新增/etc/dconf/db/local.d資料夾：\nmkdir /etc/dconf/db/local.d/\n編輯/etc/dconf/db/local.d/00-screensaver檔案，新增或修改成以下內容：\n[org/gnome/desktop/session]\nidle-delay=uint32 900\n[org/gnome/desktop/screensaver]\nlock-delay=uint32 0\n開啟終端機，執行以下指令，使設定檔生效：#dconf update"
  },
  {
    "id": "TWGCB-01-014-0229",
    "category": "GNOME設定",
    "name": "GNOME使用者會談逾時時間鎖定",
    "description": "這項原則設定決定GNOME使用者會談逾時時間設定是否鎖定\n鎖定使用者會談逾時時間設定值，避免使用者另外新增設定檔，覆蓋系統設定值",
    "method": "編輯/etc/dconf/profile/user檔案，新增或修改成以下內容：\nuser-db:user\nsystem-db:local\n開啟終端機，執行以下指令，新增/etc/dconf/db/local.d/locks資料夾：\nmkdir -p /etc/dconf/db/local.d/locks\n編輯/etc/dconf/db/local.d/locks/screensaver檔案，新增或修改成以下內容：\n/org/gnome/desktop/session/idle-delay\n/org/gnome/desktop/screensaver/lock-delay\n開啟終端機，執行以下指令，使設定檔生效：#dconf update",
    "expected": "啟用",
    "check_cmd": "gsettings get org.gnome.desktop.screensaver lock-delay 2>/dev/null | grep -q 'uint32 0' && echo PASS || echo FAIL",
    "remediation": "編輯/etc/dconf/profile/user檔案，新增或修改成以下內容：\nuser-db:user\nsystem-db:local\n開啟終端機，執行以下指令，新增/etc/dconf/db/local.d/locks資料夾：\nmkdir -p /etc/dconf/db/local.d/locks\n編輯/etc/dconf/db/local.d/locks/screensaver檔案，新增或修改成以下內容：\n/org/gnome/desktop/session/idle-delay\n/org/gnome/desktop/screensaver/lock-delay\n開啟終端機，執行以下指令，使設定檔生效：#dconf update"
  },
  {
    "id": "TWGCB-01-014-0230",
    "category": "GNOME設定",
    "name": "卸除式儲存裝置",
    "description": "這項原則設定決定GNOME是否自動掛載卸除式儲存裝置\n卸除式儲存裝置(如USB隨身碟)被廣泛使用，雖然方便進行資料傳遞，卻也成為惡意程式滲透入侵常見手段之一，停用卸除式儲存裝置將減少系統實體攻擊面，降低惡意程式感染風險",
    "method": "編輯/etc/dconf/profile/user檔案，新增或修改成以下內容：\nuser-db:user\nsystem-db:local\n開啟終端機，執行以下指令，新增/etc/dconf/db/local.d資料夾：\nmkdir /etc/dconf/db/local.d/\n編輯/etc/dconf/db/local.d/00-media-automount檔案，新增或修改成以下內容：\n[org/gnome/desktop/media-handling]\nautomount=false automount-open=false\n開啟終端機，執行以下指令，使設定檔生效：#dconf update",
    "expected": "false",
    "check_cmd": "gsettings get org.gnome.desktop.media-handling automount 2>/dev/null | grep -q 'false' && echo PASS || echo FAIL",
    "remediation": "編輯/etc/dconf/profile/user檔案，新增或修改成以下內容：\nuser-db:user\nsystem-db:local\n開啟終端機，執行以下指令，新增/etc/dconf/db/local.d資料夾：\nmkdir /etc/dconf/db/local.d/\n編輯/etc/dconf/db/local.d/00-media-automount檔案，新增或修改成以下內容：\n[org/gnome/desktop/media-handling]\nautomount=false automount-open=false\n開啟終端機，執行以下指令，使設定檔生效：#dconf update"
  },
  {
    "id": "TWGCB-01-014-0231",
    "category": "GNOME設定",
    "name": "卸除式儲存裝置鎖定",
    "description": "這項原則設定決定自動掛載卸除式儲存裝置設定是否鎖定\n鎖定自動掛載卸除式儲存裝置設定值，避免使用者另外新增設定檔，覆蓋系統設定值",
    "method": "編輯/etc/dconf/profile/user檔案，新增或修改成以下內容：\nuser-db:user\nsystem-db:local\n開啟終端機，執行以下指令，新增/etc/dconf/db/local.d/locks資料夾：\nmkdir -p /etc/dconf/db/local.d/locks\n編輯/etc/dconf/db/local.d/locks/ media-handling檔案，新增或修改成以下內容：\n/org/gnome/desktop/media-handling/automount\n/org/gnome/desktop/media-handling/automount-open\n開啟終端機，執行以下指令，使設定檔生效：#dconf update",
    "expected": "啟用",
    "check_cmd": "grep -r 'automount=false' /etc/dconf/db/ 2>/dev/null | grep -q . && echo PASS || echo FAIL",
    "remediation": "編輯/etc/dconf/profile/user檔案，新增或修改成以下內容：\nuser-db:user\nsystem-db:local\n開啟終端機，執行以下指令，新增/etc/dconf/db/local.d/locks資料夾：\nmkdir -p /etc/dconf/db/local.d/locks\n編輯/etc/dconf/db/local.d/locks/ media-handling檔案，新增或修改成以下內容：\n/org/gnome/desktop/media-handling/automount\n/org/gnome/desktop/media-handling/automount-open\n開啟終端機，執行以下指令，使設定檔生效：#dconf update"
  },
  {
    "id": "TWGCB-01-014-0232",
    "category": "GNOME設定",
    "name": "Autorun",
    "description": "這項原則設定決定GNOME是否藉由設定autorun-never參數，以停用卸除式儲存裝置之Autorun功能\n惡意程式時常透過Autorun功能，在卸除式儲存裝置掛載系統時自動執行\n將autorun-never設為true，以停用Autorun功能，降低惡意程式感染風險",
    "method": "編輯/etc/dconf/profile/user檔案，新增或修改成以下內容：\nuser-db:user\nsystem-db:local\n開啟終端機，執行以下指令，新增/etc/dconf/db/local.d資料夾：\nmkdir /etc/dconf/db/local.d/\n編輯/etc/dconf/db/local.d/00-media-autorun檔案，新增或修改成以下內容：\n[org/gnome/desktop/media-handling]\nautorun-never=true\n開啟終端機，執行以下指令，使設定檔生效：#dconf update",
    "expected": "true",
    "check_cmd": "gsettings get org.gnome.desktop.media-handling autorun-never 2>/dev/null | grep -q 'true' && echo PASS || echo FAIL",
    "remediation": "編輯/etc/dconf/profile/user檔案，新增或修改成以下內容：\nuser-db:user\nsystem-db:local\n開啟終端機，執行以下指令，新增/etc/dconf/db/local.d資料夾：\nmkdir /etc/dconf/db/local.d/\n編輯/etc/dconf/db/local.d/00-media-autorun檔案，新增或修改成以下內容：\n[org/gnome/desktop/media-handling]\nautorun-never=true\n開啟終端機，執行以下指令，使設定檔生效：#dconf update"
  },
  {
    "id": "TWGCB-01-014-0233",
    "category": "GNOME設定",
    "name": "Autorun鎖定",
    "description": "這項原則設定決定Autorun設定是否鎖定\n鎖定自動掛載卸除式儲存裝置設定值，避免使用者另外新增設定檔，覆蓋系統設定值",
    "method": "編輯/etc/dconf/profile/user檔案，新增或修改成以下內容：\nuser-db:user\nsystem-db:local\n開啟終端機，執行以下指令，新增/etc/dconf/db/local.d/locks資料夾：\nmkdir -p /etc/dconf/db/local.d/locks\n編輯/etc/dconf/db/local.d/locks/ media-handling檔案，新增或修改成以下內容：\n/org/gnome/desktop/media-handling/autorun-never\n開啟終端機，執行以下指令，使設定檔生效：#dconf update",
    "expected": "啟用",
    "check_cmd": "grep -r 'autorun-never=true' /etc/dconf/db/ 2>/dev/null | grep -q . && echo PASS || echo FAIL",
    "remediation": "編輯/etc/dconf/profile/user檔案，新增或修改成以下內容：\nuser-db:user\nsystem-db:local\n開啟終端機，執行以下指令，新增/etc/dconf/db/local.d/locks資料夾：\nmkdir -p /etc/dconf/db/local.d/locks\n編輯/etc/dconf/db/local.d/locks/ media-handling檔案，新增或修改成以下內容：\n/org/gnome/desktop/media-handling/autorun-never\n開啟終端機，執行以下指令，使設定檔生效：#dconf update"
  },
  {
    "id": "TWGCB-01-014-0234",
    "category": "GNOME設定",
    "name": "XDMCP協定",
    "description": "這項原則設定決定是否啟用XDMCP協定\nXDMCP(X Display Manager Control Protocol)協定提供遠端桌面連線\n由於XDMCP不是加密協定，使得攻擊者可能透過中間人攻擊，取得用戶的帳號通行碼，進而冒充用戶的身分\n停用此協定可減少系統被攻擊面",
    "method": "開啟終端機，執行vim指令，在/etc/gdm3/目錄，新增或編輯「custom.conf」檔案，範例如下：\n#vim /etc/gdm3/custom.conf\n並在檔案中加入以下內容：\n[xdmcp]\nEnable=false",
    "expected": "false",
    "check_cmd": "grep -ri 'Enable=false\\|xdmcp.*enable.*false' /etc/gdm3/ 2>/dev/null | grep -q . && echo PASS || echo FAIL",
    "remediation": "開啟終端機，執行vim指令，在/etc/gdm3/目錄，新增或編輯「custom.conf」檔案，範例如下：\n#vim /etc/gdm3/custom.conf\n並在檔案中加入以下內容：\n[xdmcp]\nEnable=false"
  }
]