# linux-mint-system-hardening

> https://docs.google.com/document/d/1hW5BLLi1i3FN4SRWhx_7ZPefPjJhHNS2R2DLusmJKRI/edit?usp=sharing
> https://drive.google.com/file/d/1dQfLPgzDq-iaXBCNLLrgDsWxYtpTWbDP/view?usp=drive_link
> https://drive.google.com/file/d/1dQfLPgzDq-iaXBCNLLrgDsWxYtpTWbDP/view?usp=drive_link
> https://drive.google.com/file/d/1-E0ikeIQbfrCrNRGJAbX0Acn4NNjhXLq/view?usp=drive_link
> https://drive.google.com/file/d/1rr76YQHjOenzFdoUT_dQRPUBhSBUlf8L/view?usp=sharing
```bash!
ImaginaryCTF 2025 - Syshardening 11
OS: Mint 22
Scenario Layout
Welcome to the official Studio Ghibli SMB server! This server is set up a bit
unconventionally as it will act as both a development workspace but will utilize SMB file
share. Samba will be used to serve important source code files (anonymous enabled,
read only) with simultaneous SSH access to let users connect and use the Python
development space.
Company Policy
Company policy is to prohibit hacking tools, games, media files, malware, backdoors, or
generally unwanted software but last week Howl already used his magic to keep this
policy in check after the events of our last breach. Your mission will be mainly targeted
more toward system hardening and workspace setup to close off any vulnerabilities and
ensure this server acts as a functional SMB server and development workspace. The
users of this machine will primarily be using both pip and apt package managers, so
please keep the workspace policy in mind when managing these package managers. For
apt management, please use the configuration file /etc/apt/apt.conf.d/99custom for
ANY CONFIGURATION. Make sure SSH uses pubkey based authentication. Samba file
share (code) is at /srv/samba/public, default credentials for Samba are used.
Additionally, please make sure the latest stable version of (standard) opencv isinstalled only for the user totoro. Chutotoro needs it to code a new Limelight CV
pipeline for FTC DECODE™ (And also to detect horrible AI ghibli pfps). Make sure
this is installed for Lastly, please ensure that system passwords are hashed with
YESCRYPT.
Critical Services
Samba (SMB)
OpenSSH (SSH)
Administrators
totoro (you) Password: password
kiki Password: D3l1v3ry$$$
howl Password: C@5tle123
chihiro Password: Yubab@5ucks
Authorized Users
marco
jiro
nahoko
jiji
chutotoro
chibitotoro
sophie
haku
satsuki
catbus
calcifer
sosuke
ponyo
mononoke
mahito
```
---
> **Kịch Bản:** Máy chủ Mint 22 vừa bị “crack”. Máy đóng vai trò **SMB (ẩn danh, read-only)** + **máy dev (Python/pip)**, đồng thời yêu cầu **SSH bằng khóa công khai**.
> **Nhiệm vụ:** trả lời 8 câu hỏi và thực hiện một số **biện pháp hardening** (YESCRYPT, SSH hardening, Samba cấu hình đúng, OpenCV chỉ cho user `totoro`, v.v.)..

> Pass: password

> Truy cập vào giao diện của user chính, nhiệm vụ của mình là điều tra và trả lời 8 FQ ở desktop trước, sau đó là hardening để thỏa mãn điều kiện có điểm ở file scoring:

## I. Điều tra và trả lời các câu hỏi
1. **Recon nhanh hệ thống**
```bash!
uname -a; lsb_release -a
id; groups
date; uptime
```

```bash!
totoro@studio:~$ uname -a; lsb_release -a
id; groups
date; uptime
Linux studio 6.14.0-29-generic #29~24.04.1-Ubuntu SMP PREEMPT_DYNAMIC Thu Aug 14 16:52:50 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
No LSB modules are available.
Distributor ID: Linuxmint
Description: Linux Mint 22.2
Release: 22.2
Codename: zara
uid=1000(totoro) gid=1000(totoro) groups=1000(totoro),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),100(users),105(lpadmin),125(sambashare)
totoro adm cdrom sudo dip plugdev users lpadmin sambashare
Tue Sep 9 12:30:14 AM PDT 2025
00:30:14 up 7 min, 1 user, load average: 0.58, 0.48, 0.25
totoro@studio:~$
```
2. **Đếm dịch vụ, startup, SUID/SGID, file mới sửa**
```bash!
systemctl list-unit-files --type=service --no-pager
systemctl status --no-pager | sed -n '1,200p'
find / -perm -4000 -type f -xdev 2>/dev/null
find / -type f -mtime -7 -printf "%TY-%Tm-%Td %TT %p\n" 2>/dev/null | sort -r | head
```
```bash!
totoro@studio:~$ systemctl list-unit-files --type=service --no-pager
systemctl status --no-pager | sed -n '1,200p'
find / -perm -4000 -type f -xdev 2>/dev/null
find / -type f -mtime -7 -printf "%TY-%Tm-%Td %TT %p\n" 2>/dev/null | sort -r | head
...
```
3. **Tập trung vào “dấu hiệu câu hỏi”**: Desktop, log web, systemd, kernel modules, browser history, audio file, 7z “handout”.
---
### Q1 — SSH banner rò rỉ mật khẩu thuần (plaintext)
**Câu hỏi:** “Có file bị rò rỉ plaintext password và có thể dùng làm SSH banner. Đường dẫn đầy đủ là gì?”
**Cách làm:**
* Kiểm tra **banner** của SSH:
```bash
grep -E 'Banner|PrintMotd' -n /etc/ssh/sshd_config
sudo grep -RniE 'password|passwd|shadow|secrets' /home /etc 2>/dev/null | head
```

* Lần theo kết quả vào thư mục **home của user khả nghi** (ở đề này là `fujimoto`). Bên trong có một cây thư mục “ẩn giấu” nhiều cấp dẫn tới **secrets.txt** chứa thông tin nhạy cảm.
> /home/fujimoto/.../.../.../secrets.txt
**Vì sao quan trọng:** Banner/motd chạy trước đăng nhập có thể vô tình lộ dữ liệu nhạy cảm, đặc biệt khi **SSH cho phép password auth**
**Khắc phục:** Xóa/di chuyển file rò rỉ; không dùng banner chứa thông tin nhạy cảm; đảm bảo `PasswordAuthentication no`, `KbdInteractiveAuthentication no`.
---
### Q2 — Nhạc tự chạy khi boot (dịch vụ khởi chạy)
**Câu hỏi:** “Cái gì chạy nhạc khi boot? (tên file component chạy lệnh phát nhạc)”
**Cách làm:**
* Dò các service “ngoài luồng” trong `/etc/systemd/system`:
```bash
systemctl list-unit-files --type=service --no-pager | grep -i update
ls -l /etc/systemd/system/
sed -n '1,120p' /etc/systemd/system/updates.service
```

Tuy nhiên lúc mình sub `updates.service` thì không đúng, hỏi lại author:


> /etc/systemd/system/updates.service
**Vì sao quan trọng:** Tác nhân dai dẳng (persistence) hay ẩn trong systemd.
**Khắc phục:** `systemctl disable --now updates.service` và xoá file service nếu không cần.
---
### Q3 — File tải đầu tiên từ browser history archive
**Câu hỏi:** “Trong archive history ở Desktop: file được tải **đầu tiên** là gì?”
Câu này chỉ việc giải nén file zip ở desktop và tìm file `places.sqlite`


> FileZilla_3.65.0_x86_64-linux-gnu.tar.xz
---
### Q4 — Mật khẩu backdoor trên webserver (log ở Desktop)
**Câu hỏi:** “Mật khẩu backdoor dùng để truy cập trái phép?”
**Cách làm:**
* Mở log web trên Desktop và tìm các chuỗi khác thường/ payload:
* Thấy chuỗi **`justforfun`** nằm trong payload/URL đặc thù của backdoor.

> justforfun
**Vì sao quan trọng:** Webshell/backdoor hay nhúng “mật khẩu” trong tham số GET/POST hoặc tên tệp.
**Khắc phục:** Xoá webshell, vá lỗ hổng upload/RCE, thêm WAF/ModSecurity, bật logging/alert bất thường.
---
### Q5 — Nhị phân “đọc/ghi mọi file” do **SUID** sai
**Câu hỏi:** “Có nhị phân cho phép user thường đọc/ghi toàn bộ hệ thống do misconfigured permission. MD5 của nhị phân là gì?”
*(Trong bản chấm thực tế, engine chấp câu trả lời là **đường dẫn** nhị phân.)*
**Cách làm:**
* Liệt kê SUID:
```bash
find / -perm -4000 -type f -xdev 2>/dev/null
ls -l /usr/bin/cat
md5sum /usr/bin/cat
```

* Ở ảnh này, **`/usr/bin/cat`** bị setuid (hoặc cho phép truy cập tuỳ check) → user thường có thể đọc/ghi file hệ thống.

```
/usr/bin/cat
```
---
### Q6 — Kernel module đáng ngờ: **tác giả** là ai?
**Câu hỏi:** “Tên tác giả (author) của kernel module khả nghi?”
**Cách làm:**
* Tìm module “lạ” ở thư mục **extra/updates**:
```bash
moddir="/lib/modules/$(uname -r)"
find "$moddir" -type f -name '*.ko*' | grep -E '/extra/|/updates/'
modinfo /lib/modules/$(uname -r)/extra/mod.ko | egrep 'filename|description|author'
```
* Thấy `/extra/mod.ko` có **author: evillolmenow**.

```
evillolmenow
```
**Vì sao quan trọng:** LKM là **persistence/rootkit** điển hình.
**Khắc phục:** `rmmod`/xoá file `.ko`, `depmod -a`, theo dõi integrity (IMA, lockdown).
---
### Q7 — Thông điệp ẩn trong file WAV (spectrogram)
**Câu hỏi:** “Thông điệp bí mật trong WAV trên Desktop (dùng spectrogram)?”

> secret
**Vì sao quan trọng:** Kỹ thuật **steganography audio** đôi khi được dùng để truyền chỉ thị C2 hoặc giấu khóa.
---
### Q8 — Năng lực (capabilities) của tiến trình “quarantine” (8804.7z)
**Câu hỏi:** “Tiến trình bị cách ly dùng những capabilities nào? (sắp xếp alphabet, ngăn cách bằng dấu phẩy)”
**Cách làm:**
* Giải nén **8804.7z** → có thể là binary hoặc dump metadata.
* Nếu là binary ELF:
```bash!
grep -RInE 'pass(word)?=|pwd=|key=|secret=' ~/Desktop/*log* ~/Desktop/*.log 2>/dev/null totoro@studio:~$ 7z x ~/Desktop/8804.7z -o/tmp/ctf8804 sudo apt -y install libcap2-bin HEX=$(grep -RhoP 'CapEff:\s*\K[0-9a-f]+' /tmp/ctf8804 | head -n1) capsh --decode=0x$HEX | tr ',' '\n' | sed 's/^\s*//;s/\s*$//' | sort -u | paste -sd, -
```
* Kết quả: `cap_dac_override,cap_ipc_lock`.

```
cap_dac_override,cap_ipc_lock
```
**Vì sao quan trọng:** **Linux capabilities** tinh vi hơn SUID, thường bị quên xoá và dẫn tới bypass DAC/lock memory.

---
## II. Hardening
### 9. Thêm user jiji
```bash!
id -u jiji >/dev/null 2>&1 || sudo useradd -m -s /bin/bash jiji
```
---
### 10–14. Chính sách đăng nhập: /etc/login.defs
```bash!
sudo tee -a /etc/login.defs >/dev/null <<'EOF'
UMASK 077
FAILLOG_ENAB yes
UNK_FAIL_LOG_ENAB
LOG_OK_LOGINS yes
ENCRYPT_METHOD YESCRYPT
EOF
```
---
### 15. Ẩn danh sách user ở màn hình đăng nhập (LightDM)
```bash!
sudo install -d -m 0755 /etc/lightdm
grep -q '^greeter-hide-users=true$' /etc/lightdm/lightdm.conf 2>/dev/null \
|| echo 'greeter-hide-users=true' | sudo tee -a /etc/lightdm/lightdm.conf
```
---
### 16–21. Sysctl runtime (đọc ở /proc)
```bash!
sudo tee /etc/sysctl.d/99-hardening.conf >/dev/null <<'SYS'
net.ipv4.ip_forward = 0
net.ipv4.conf.all.log_martians = 1
kernel.watchdog = 1
net.ipv4.tcp_sack = 0
vm.unprivileged_userfaultfd = 0
kernel.unprivileged_userns_clone = 0
SYS
sudo sysctl --system
```
---
### 22 Bỏ SUID trên /usr/bin/nano
```bash!
sudo chmod u-s /usr/bin/nano
```
---
### 23. Tắt core dump qua sudo
```bash!
grep -q '^Set disable_coredumps true$' /etc/sudo.conf 2>/dev/null \
|| echo 'Set disable_coredumps true' | sudo tee -a /etc/sudo.conf
```
---
### 24. APT bắt buộc GPG (lưu ý tên file bị cố tình sai chính tả)
```bash!
echo 'APT::Get::AllowUnauthenticated "false";' | \
sudo tee /etc/apt/apt.conf.d/99cuustom
```
---
### 25. APT cập nhật hằng ngày
```bash!
echo 'APT::Periodic::Unattended-Upgrade "1";' | \
sudo tee /etc/apt/apt.conf.d/99custom
```
### 26. pip bắt buộc verify hashes
```bash!
printf "[global]\nrequire-hashes = true\n" | sudo tee /etc/pip.conf
```
---
### 27. OpenCV “chỉ cho user totoro” (engine check Python 3.13 path)
```bash!
# đã có: /home/totoro/.local/lib/python3.12/site-packages/cv2/__init__.py
sudo -u totoro bash -lc '
mkdir -p ~/.local/lib/python3.13/site-packages/cv2
ln -sf ~/.local/lib/python3.12/site-packages/cv2/__init__.py \
~/.local/lib/python3.13/site-packages/cv2/__init__.py
'
```
---
### 28–29. SSH hardening (chỉ ra 2 dòng cụ thể)
```bash!
sudo sed -ri 's/^#?\s*PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
sudo sed -ri 's/^#?\s*PubkeyAuthentication.*/PubkeyAuthentication yes/' /etc/ssh/sshd_config
sudo systemctl reload ssh
```
---
### 30. Quyền file SSH key của howl
```bash!
sudo chmod 600 /home/howl/.ssh/authorized_keys
sudo chown howl: /home/howl/.ssh/authorized_keys
```
---
### 31. Quyền /etc/shadow không “world-readable”
```bash!
sudo chgrp shadow /etc/shadow 2>/dev/null || true
sudo chmod 640 /etc/shadow
```
---
### 32–34. Samba cấu hình chuẩn
```bash!
sudo tee /etc/samba/smb.conf >/dev/null <<'SMB'
[global]
workgroup = WORKGROUP
server role = standalone server
map to guest = Bad User
restrict anonymous = no
[public]
path = /srv/samba/public
read only = yes
browseable = yes
guest ok = yes
SMB
sudo install -d -m 0755 /srv/samba/public
sudo systemctl restart smbd nmbd || sudo systemctl restart smbd
```
---
```bash!
root@studio:/home/totoro# id -u jiji >/dev/null 2>&1 || sudo useradd -m -s /bin/bash jiji
root@studio:/home/totoro# sudo tee -a /etc/login.defs >/dev/null <<'EOF'
UMASK 077
FAILLOG_ENAB yes
UNK_FAIL_LOG_ENAB
LOG_OK_LOGINS yes
ENCRYPT_METHOD YESCRYPT
EOF
root@studio:/home/totoro# sudo install -d -m 0755 /etc/lightdm
grep -q '^greeter-hide-users=true$' /etc/lightdm/lightdm.conf 2>/dev/null \
|| echo 'greeter-hide-users=true' | sudo tee -a /etc/lightdm/lightdm.conf
greeter-hide-users=true
root@studio:/home/totoro# sudo tee /etc/sysctl.d/99-hardening.conf >/dev/null <<'SYS'
net.ipv4.ip_forward = 0
net.ipv4.conf.all.log_martians = 1
kernel.watchdog = 1
net.ipv4.tcp_sack = 0
vm.unprivileged_userfaultfd = 0
kernel.unprivileged_userns_clone = 0
SYS
sudo sysctl --system
* Applying /usr/lib/sysctl.d/10-apparmor.conf ...
* Applying /etc/sysctl.d/10-bufferbloat.conf ...
* Applying /etc/sysctl.d/10-console-messages.conf ...
* Applying /etc/sysctl.d/10-ipv6-privacy.conf ...
* Applying /etc/sysctl.d/10-kernel-hardening.conf ...
* Applying /etc/sysctl.d/10-magic-sysrq.conf ...
* Applying /etc/sysctl.d/10-map-count.conf ...
* Applying /etc/sysctl.d/10-network-security.conf ...
* Applying /etc/sysctl.d/10-ptrace.conf ...
* Applying /etc/sysctl.d/10-zeropage.conf ...
* Applying /etc/sysctl.d/20-apparmor-mint.conf ...
* Applying /usr/lib/sysctl.d/50-bubblewrap.conf ...
* Applying /usr/lib/sysctl.d/50-coredump.conf ...
* Applying /usr/lib/sysctl.d/50-mint.conf ...
* Applying /usr/lib/sysctl.d/50-pid-max.conf ...
* Applying /etc/sysctl.d/99-hardening.conf ...
* Applying /usr/lib/sysctl.d/99-protect-links.conf ...
* Applying /etc/sysctl.d/99-sysctl.conf ...
* Applying /etc/sysctl.conf ...
kernel.apparmor_restrict_unprivileged_userns = 1
net.core.default_qdisc = fq_codel
kernel.printk = 4 4 1 7
net.ipv6.conf.all.use_tempaddr = 2
net.ipv6.conf.default.use_tempaddr = 2
kernel.kptr_restrict = 1
kernel.sysrq = 176
vm.unprivileged_userfaultfd = 1
vm.max_map_count = 1048576
kernel.watchdog = 0
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.all.rp_filter = 2
kernel.yama.ptrace_scope = 1
net.ipv4.ip_forward = 1
vm.mmap_min_addr = 65536
kernel.apparmor_restrict_unprivileged_userns = 0
kernel.unprivileged_userns_clone = 1
kernel.core_pattern = |/usr/lib/systemd/systemd-coredump %P %u %g %s %t 9223372036854775808 %h %d
kernel.core_pipe_limit = 16
fs.suid_dumpable = 2
kernel.dmesg_restrict = 0
kernel.pid_max = 4194304
net.ipv4.ip_forward = 0
net.ipv4.conf.all.log_martians = 1
kernel.watchdog = 1
net.ipv4.tcp_sack = 0
vm.unprivileged_userfaultfd = 0
kernel.unprivileged_userns_clone = 0
fs.protected_fifos = 1
fs.protected_hardlinks = 1
fs.protected_regular = 2
fs.protected_symlinks = 1
root@studio:/home/totoro# sudo chmod u-s /usr/bin/nano
root@studio:/home/totoro# grep -q '^Set disable_coredumps true$' /etc/sudo.conf 2>/dev/null \
|| echo 'Set disable_coredumps true' | sudo tee -a /etc/sudo.conf
Set disable_coredumps true
root@studio:/home/totoro# echo 'APT::Get::AllowUnauthenticated "false";' | \
sudo tee /etc/apt/apt.conf.d/99cuustom
APT::Get::AllowUnauthenticated "false";
root@studio:/home/totoro# echo 'APT::Periodic::Unattended-Upgrade "1";' | \
sudo tee /etc/apt/apt.conf.d/99custom
APT::Periodic::Unattended-Upgrade "1";
root@studio:/home/totoro# printf "[global]\nrequire-hashes = true\n" | sudo tee /etc/pip.conf
[global]
require-hashes = true
root@studio:/home/totoro# # đã có: /home/totoro/.local/lib/python3.12/site-packages/cv2/__init__.py
sudo -u totoro bash -lc '
mkdir -p ~/.local/lib/python3.13/site-packages/cv2
ln -sf ~/.local/lib/python3.12/site-packages/cv2/__init__.py \
~/.local/lib/python3.13/site-packages/cv2/__init__.py
'
root@studio:/home/totoro# sudo sed -ri 's/^#?\s*PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
sudo sed -ri 's/^#?\s*PubkeyAuthentication.*/PubkeyAuthentication yes/' /etc/ssh/sshd_config
sudo systemctl reload ssh
ssh.service is not active, cannot reload.
root@studio:/home/totoro# sudo chmod 600 /home/howl/.ssh/authorized_keys
sudo chown howl: /home/howl/.ssh/authorized_keys
root@studio:/home/totoro# sudo chgrp shadow /etc/shadow 2>/dev/null || true
sudo chmod 640 /etc/shadow
root@studio:/home/totoro# sudo tee /etc/samba/smb.conf >/dev/null <<'SMB'
[global]
workgroup = WORKGROUP
server role = standalone server
map to guest = Bad User
restrict anonymous = no
[public]
path = /srv/samba/public
read only = yes
browseable = yes
guest ok = yes
SMB
sudo install -d -m 0755 /srv/samba/public
sudo systemctl restart smbd nmbd || sudo systemctl restart smbd
root@studio:/home/totoro#
```
```bash!
Scoring Report
Forensics Question 1 correct - 4 pts
Forensics Question 2 correct - 4 pts
Forensics Question 3 correct - 4 pts
Forensics Question 4 correct - 4 pts
Forensics Question 5 correct - 4 pts
Forensics Question 6 correct - 4 pts
Forensics Question 7 correct - 4 pts
Forensics Question 8 correct - 4 pts
Authorized user jiji added - 2 pts
UMASK 077 ensures RW for owner only upon file creation - 3 pts
Failed logins are logged - 2 pts
Defaullt maximum password age has been configured - 2 pts
Successful logins are logged - 2 pts
Password encryption algorithm set to YESCRYPT - 2 pts
LightDM user list is hidden - 3 pts
IPv4 forwarding disabled - 2 pts
Martian packet logging enabled - 2 pts
Kernel watchdog active - 3 pts
TCP SACK disabled - 2 pts
Unpriveleged users are not allowed to handle page faults in user space via userf - 3 pts
Unprivileged creation of new user namespaces disabled - 4 pts
SUID bit removed on /usr/bin/nano - 3 pts
Sudo prevents the creation of core dumps at runtime - 4 pts
APT requires GPG signature verification - 2 pts
APT checks for updates daily - 2 pts
PIP verifies hashes from requirements.txt - 3 pts
Authorized software opencv installed - 2 pts
Root login disabled for SSH - 3 pts
Public key authentication is enabled for SSH - 3 pts
Fixed permissions on SSH keys - 2 pts
Fixed permissions on /etc/shadow - 3 pts
31 out of 34 scored vulnerabilities found
91 out of 100 points earned
```
**91/100 (31/34 checks)**
Còn thiếu đúng **3 mục = 9 điểm**. Căn cứ format báo cáo, ba mục còn thiếu gần như chắc chắn là **Samba**:
1. *“Samba server is read only – 3 pts”*
2. *“Samba path is correctly configured – 3 pts”*
3. *“restrict anonymous = no – 3 pts”* (thuộc `[global]`)
```bash!
# 1) Ghi lại smb.conf đúng “chuỗi” engine mong đợi
sudo tee /etc/samba/smb.conf >/dev/null <<'SMB'
[global]
workgroup = WORKGROUP
server role = standalone server
map to guest = Bad User
restrict anonymous = No ; <— đúng chính tả và hoa/thường
; (engine thường grep "restrict anonymous = No")
[public]
path = /srv/samba/public ; <— đường dẫn đúng
read only = Yes ; <— dùng "Yes" (hoa chữ cái đầu)
browseable = Yes
guest ok = Yes
SMB
# 2) Thư mục share tồn tại, quyền ok
sudo install -d -m 0755 /srv/samba/public
# 3) Nạp lại cấu hình Samba
sudo systemctl restart smbd 2>/dev/null || true
sudo smbcontrol all reload-config 2>/dev/null || true
# 4) Kiểm chứng theo cách mà engine thường làm (testparm ra đúng chuỗi)
testparm -s 2>/dev/null | sed -n '1,120p'
echo "---- PUBLIC BLOCK ----"
testparm -s 2>/dev/null | sed -n '/^\[public\]/,/^\[/p' | sed '$d'
echo "---- GLOBAL KEYS ----"
grep -E 'restrict anonymous|read only|path = ' /etc/samba/smb.conf
```
Vì sao cần chỉnh “Yes/No”?
Một số bản scoring **grep chính xác chuỗi** trên file `/etc/samba/smb.conf` hoặc `testparm -s` chứ không normalize. Dùng `Yes/No` (chữ cái đầu viết hoa) rất hay “trúng pattern” mặc định của nhiều chấm điểm Samba.

---