Linux 下实现“连 root 都无法查看和删除”的加密文件夹(附一键挂载 + 自动超时退出)

🌟 前言

在 Linux 系统中,root 用户几乎拥有“上帝权限”——可以读取、修改、删除任何文件。但你是否曾想过:能否创建一个连 root 都无法查看内容、甚至无法删除的加密文件夹?

虽然 完全阻止 root 删除文件在理论上不可能(root 可以卸载文件系统、加载内核模块等),但我们可以通过 加密 + 不可变属性 + 自动化脚本 的组合,实现一个“实际意义上防 root 访问”的安全文件夹。

本文将手把手教你:

✅ 使用 cryptsetup + LUKS 创建强加密容器
✅ 设置 chattr +i 防止 root 删除
✅ 实现 无操作 10 分钟自动卸载(可自定义)
✅ 创建 桌面一键挂载快捷方式,像 U 盘一样方便
✅ 全程脚本化管理,安全又省心


🧩 一、技术原理

1. 为什么 root 不能完全被限制?

  • root 可以:
    • 读取所有文件
    • 修改权限
    • 卸载磁盘
    • 进入单用户模式
  • 所以 “完全防 root” 是不可能的

✅ 但我们能实现:

目标是否可达实现方式
root 无法读取内容LUKS 加密,无密码无法解密
root 无法删除文件⚠️(有限)chattr +i 设置 immutable 属性
root 无法长期访问自动卸载 + 无操作超时关闭

🔐 核心思想:加密保护内容,属性保护文件,自动化提升安全性


🛠️ 二、创建加密容器(LUKS + cryptsetup)

1. 安装依赖

sudo apt update
sudo apt install cryptsetup inotify-tools libnotify-bin -y

⚠️ inotify-tools 用于监听文件操作,libnotify-bin 用于弹出通知。


2. 创建项目目录

我们统一管理所有加密相关文件:

mkdir -p ~/crypt_data/mount

3. 创建加密镜像文件(如 1GB)

dd if=/dev/zero of=~/crypt_data/container.img bs=1M count=1024

你也可以用 fallocate 更快:

fallocate -l 1G ~/crypt_data/container.img

4. 初始化 LUKS 加密

sudo cryptsetup luksFormat ~/crypt_data/container.img

💡 系统会提示你设置密码,请使用高强度密码


5. 格式化为 ext4 文件系统

sudo cryptsetup open ~/crypt_data/container.img crypt_data_volume --type luks
sudo mkfs.ext4 /dev/mapper/crypt_data_volume
sudo cryptsetup close crypt_data_volume

📜 三、自动化管理脚本(核心)

我们将创建一个功能完整的脚本,支持:

  • init:初始化容器
  • start:挂载(支持 --timeout=N
  • stop:关闭
  • protect:启用防删除
  • unprotect:取消保护
  • 自动超时退出

1. 创建脚本文件

nano ~/crypt_data/crypt-container

2. 粘贴以下脚本内容

#!/bin/bash

# === 配置区 ===
CRYPT_DIR="$HOME/crypt_data"
CONTAINER_IMG="$CRYPT_DIR/container.img"
MOUNT_POINT="$CRYPT_DIR/mount"
MAPPER_NAME="crypt_data_volume"
SCRIPT_PATH="$CRYPT_DIR/crypt-container"

TIMEOUT=600  # 默认 10 分钟自动退出(秒)

if [[ $EUID -eq 0 ]]; then
   echo "❌ 错误:请不要以 root 身份运行此脚本。"
   exit 1
fi

setup_crypt_dir() {
    [[ ! -d "$CRYPT_DIR" ]] && mkdir -p "$CRYPT_DIR"
}

check_and_install_deps() {
    local missing=()
    for cmd in cryptsetup mount chattr lsblk inotifywait; do
        if ! command -v $cmd &> /dev/null; then
            case $cmd in
                cryptsetup) missing+=("cryptsetup") ;;
                chattr|lsattr) missing+=("e2fsprogs") ;;
                inotifywait) missing+=("inotify-tools") ;;
            esac
        fi
    done

    if [[ ${#missing[@]} -gt 0 ]]; then
        sudo apt update && sudo apt install -y "${missing[@]}" || exit 1
    fi
}

show_help() {
    cat << EOF
🔐 加密容器管理器
用法: $SCRIPT_PATH {init|start|stop|status|protect|unprotect} [--timeout=N]

选项:
  --timeout=N  设置无操作自动退出时间(秒)

示例:
  $SCRIPT_PATH start --timeout=300  # 5分钟后自动关闭
EOF
}

do_init() {
    read -p "请输入大小(MB,默认 512): " size
    size=${size:-512}

    fallocate -l ${size}M "$CONTAINER_IMG" || dd if=/dev/zero of="$CONTAINER_IMG" bs=1M count="$size"
    sudo cryptsetup luksFormat "$CONTAINER_IMG"
    sudo cryptsetup open "$CONTAINER_IMG" "$MAPPER_NAME" --type luks
    sudo mkfs.ext4 /dev/mapper/$MAPPER_NAME
    sudo cryptsetup close "$MAPPER_NAME"
    echo "✅ 初始化完成!"
}

check_container() {
    [[ ! -f "$CONTAINER_IMG" ]] && echo "❌ 容器不存在,请先 init" && exit 1
}

do_start() {
    while [[ $# -gt 0 ]]; do
        case $1 in
            --timeout=*)
                TIMEOUT="${1#*=}"
                [[ "$TIMEOUT" =~ ^[0-9]+$ ]] || exit 1
                shift
                ;;
            *) shift ;;
        esac
    done

    check_container
    do_unprotect_silent

    sudo cryptsetup open "$CONTAINER_IMG" "$MAPPER_NAME" --type luks || exit 1
    sudo mount /dev/mapper/$MAPPER_NAME "$MOUNT_POINT" || { sudo cryptsetup close "$MAPPER_NAME"; exit 1; }
    sudo chown -R $USER:$USER "$MOUNT_POINT"

    echo "✅ 已挂载到 $MOUNT_POINT"
    echo "⏱️  ${TIMEOUT}秒无操作将自动关闭"

    touch "$MOUNT_POINT/.last_access"
    while mount | grep -q "$MOUNT_POINT"; do
        inotifywait -t 1 -q -r -e modify,access "$MOUNT_POINT" > /dev/null 2>&1 && touch "$MOUNT_POINT/.last_access"
        find "$MOUNT_POINT/.last_access" -mmin +$((TIMEOUT/60)) > /dev/null 2>&1 && {
            echo "⏰ 超时!正在关闭..."
            do_stop_silent
            break
        }
        sleep 2
    done
}

do_stop_silent() {
    mount | grep -q "$MOUNT_POINT" && sudo umount "$MOUNT_POINT" 2>/dev/null || true
    sudo lsblk -o NAME | grep -q "$MAPPER_NAME" && sudo cryptsetup close "$MAPPER_NAME" 2>/dev/null || true
    do_unprotect_silent
}

do_stop() {
    do_stop_silent
    echo "✅ 已关闭"
}

do_status() {
    echo "容器: $CONTAINER_IMG"
    sudo lsblk -o NAME | grep -q "$MAPPER_NAME" && echo "🔐 已打开" || echo "🔓 未打开"
    mount | grep -q "$MOUNT_POINT" && echo "📁 已挂载" || echo "⚠️ 未挂载"
    [[ -f "$CONTAINER_IMG" ]] && sudo lsattr "$CONTAINER_IMG" | grep -q 'i' && echo "🛡️ 保护: 已启用"
}

do_protect() {
    [[ -f "$CONTAINER_IMG" ]] && sudo chattr +i "$CONTAINER_IMG" && echo "✅ 已启用防删除"
}

do_unprotect_silent() {
    [[ -f "$CONTAINER_IMG" ]] && sudo chattr -i "$CONTAINER_IMG" 2>/dev/null || true
}
do_unprotect() {
    do_unprotect_silent
    echo "🔓 保护已关闭"
}

main() {
    setup_crypt_dir
    check_and_install_deps
    case "${1:-}" in
        init)     do_init ;;
        start)    shift; do_start "$@" ;;
        stop)     do_stop ;;
        status)   do_status ;;
        protect)  do_protect ;;
        unprotect) do_unprotect ;;
        *)        show_help; exit 1 ;;
    esac
}

main "$@"

3. 添加可执行权限

chmod +x ~/crypt_data/crypt-container

⏱️ 四、启用自动超时退出(无操作自动关闭)

脚本已支持:

# 5 分钟无操作自动关闭
~/crypt_data/crypt-container start --timeout=300

# 30 分钟
~/crypt_data/crypt-container start --timeout=1800

✅ 适合办公、公共电脑等场景,防止忘记卸载。


🛡️ 五、防止 root 删除文件(chattr +i)

1. 启用保护

~/crypt_data/crypt-container protect

2. 验证

sudo rm ~/crypt_data/container.img
# 提示:Operation not permitted

3. 取消保护(升级前)

~/crypt_data/crypt-container unprotect

🖱️ 六、创建桌面快捷方式(一键挂载)

1. 创建启动脚本

nano ~/crypt_data/mount-secure.sh
#!/bin/bash
CRYPT_DIR="$HOME/crypt_data"
CONTAINER_SCRIPT="$CRYPT_DIR/crypt-container"
TIMEOUT=600

if [[ ! -x "$CONTAINER_SCRIPT" ]]; then
    notify-send -u critical "❌ 错误" "未找到脚本"
    exit 1
fi

if mount | grep -q "$CRYPT_DIR/mount"; then
    notify-send "⚠️ 已挂载"
    exit 0
fi

if command -v gnome-terminal &> /dev/null; then
    exec gnome-terminal --title="🔐 加密容器" -- bash -c "\
echo '🔓 正在打开...';
$CONTAINER_SCRIPT start --timeout=$TIMEOUT;
echo '✅ 完成,5秒后关闭...';
sleep 5;
"
else
    notify-send -u critical "⚠️ 缺少终端"
    echo "请安装 gnome-terminal"
    sleep 10
fi
chmod +x ~/crypt_data/mount-secure.sh

2. 创建桌面快捷方式

nano ~/Desktop/挂载加密文件夹.desktop
[Desktop Entry]
Version=1.0
Name=🔐 挂载加密文件夹
Comment=一键挂载,10分钟无操作自动关闭
Exec=/home/$USER/crypt_data/mount-secure.sh
Icon=folder-locked
Terminal=false
Type=Application
Categories=Utility;Security;
chmod +x ~/Desktop/挂载加密文件夹.desktop

✅ 双击即可弹出终端输入密码,实现“傻瓜式”操作。


📊 七、使用流程总结

步骤命令
首次初始化~/crypt_data/crypt-container init
挂载使用双击桌面图标 或 start --timeout=600
查看状态status
启用保护protect
手动关闭stop

🎯 八、安全性总结

安全特性是否实现说明
内容加密LUKS + 密码,root 无法读
防 root 删除⚠️chattr +i 可防常规删除
自动卸载无人操作自动关闭
一键使用桌面快捷方式,降低使用门槛

📌 九、注意事项

  1. 物理安全第一:如果别人能接触你的硬盘,仍可能暴力破解。
  2. 备份加密文件container.img 一旦损坏,数据无法恢复。
  3. 不要共享脚本:否则他人可修改逻辑绕过保护。
  4. 定期测试:确保 protect 和自动卸载正常工作。

🎁 十、结语

通过本文的方法,你已经拥有了一个:

“连 root 都无法轻易查看和删除” 的加密文件夹!

它不仅安全,还通过脚本和桌面快捷方式实现了 极简操作,真正做到了“高安全性 + 高可用性”的平衡。


🔗 相关资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值