FreeBSD 加密概念:当由另一个系统安装时,无需密码或密钥即可自动启动?

FreeBSD 加密概念:当由另一个系统安装时,无需密码或密钥即可自动启动?

最近,我安装了 FreeBSD 用于工作,并安装了 geli 用于加密。(无启动分区的全盘加密。)当我完成设置后,我发现每次启动时,我都需要输入解析密码来挂载根磁盘。

这不符合我的需要。我只希望我的系统能够自动启动,这样我就可以 ssh 到它。但是当其他人关闭我的机器并尝试使用另一个 freeBSD 系统安装我的磁盘时,他们无法做到。如果他们使用另一个 FreeBSD 系统安装分区,他们只能看到 /boot 目录。所有文件都是安全的!

我的想法可行吗?(如果由另一个系统安装,加密系统会自动启动?)如果可以,我如何使用 freeBSD 来实现?

答案1

总结: 不

如果您希望密钥在启动时自动使用,则密钥必须在启动时可访问。这意味着未加密部分磁盘。

如果它位于磁盘的未加密部分,那么其他人可以从系统中取出磁盘,读取密钥并解密磁盘的其余部分。

没有办法妥善保护磁盘而不存储密钥。

答案2

不。如果您希望自动解密,则需要将密码以明文形式存储在磁盘上,或以某种(不良)方式隐藏。意志力足够强的人将能够轻松获得该密码。如果只有“/boot”未加密,则密码必须在那里,攻击者只需找到它即可。

如果您只是不想亲自到场解锁服务器,那么可以通过安装未加密的系统来解决,该系统将启动并启动 ssh 之类的服务,使您能够从远程位置解锁数据分区。

答案3

我遇到过类似的问题,我通过仅加密 /home 解决了这个问题。问题是 /etc/rc.d/geli 想要在继续​​启动之前挂载它。一个解决办法是在启动后手动挂载,但我喜欢它在启动时建议的方式 - 我只希望网络先启动,因为 /、/var 和 /usr 未加密。

我这样说:

/dev/ada0p7.eli /home ufs rw,noauto 0 0

在 /etc/fstab 中

在 rc.conf 中创建匹配的“l”选项: lgeli_devices="ada0p7" lgeli_ada0p7_flags="-k /etc/geli/server.key" lgeli_ada0p7_autodetach="NO"

然后在 /etc/rc.d 中使用 lgeli,如下所示:

#!/bin/sh

# PROVIDE: lgeli
# REQUIRE: sshd
# KEYWORD: nojail

. /etc/rc.subr

lgeli_make_list()
{
        local devices devices2
        local provider

        devices="${lgeli_devices}"

        for provider in ${devices}; do
                provider=${provider%.eli}
                provider=${provider#/dev/}
                devices2="${devices2} ${provider}"
        done

        echo ${devices2}
}

name="lgeli"
start_precmd='[ -n "$(lgeli_make_list)" ]'
start_cmd="lgeli_start"
stop_cmd="lgeli_stop"
required_modules="geom_eli:g_eli"

lgeli_start()
{
        devices=`lgeli_make_list`

        if [ -z "${lgeli_tries}" ]; then
                if [ -n "${lgeli_attach_attempts}" ]; then
                        # Compatibility with rc.d/gbde.
                        lgeli_tries=${lgeli_attach_attempts}
                else
                        lgeli_tries=`${SYSCTL_N} kern.geom.eli.tries`
                fi
        fi

        for provider in ${devices}; do
                provider_=`ltr ${provider} '/-' '_'`

                eval "flags=\${lgeli_${provider_}_flags}"
                if [ -z "${flags}" ]; then
                        flags=${lgeli_default_flags}
                fi
                if [ -e "/dev/${provider}" -a ! -e "/dev/${provider}.eli" ]; then
                        echo "Configuring Disk Encryption for ${provider}."
                        count=1
                        while [ ${count} -le ${lgeli_tries} ]; do
                                geli attach ${flags} ${provider}
                                if [ -e "/dev/${provider}.eli" ]; then
                                        # LOUIS line below, so long as
                                        # /etc/fstab... noauto line
                                        # present, this works
                                        mount "/dev/${provider}.eli"
                                        break
                                fi
                                echo "Attach failed; attempt ${count} of ${lgeli_tries}."
                                count=$((count+1))
                        done
                fi
        done
}

lgeli_stop()
{
        devices=`lgeli_make_list`

        for provider in ${devices}; do
                if [ -e "/dev/${provider}.eli" ]; then
                        umount "/dev/${provider}.eli" 2>/dev/null
                        geli detach "${provider}"
                fi
        done
}

load_rc_config $name
run_rc_command "$1"

这样,它就相当干净,而且不会太麻烦。lgeli 中的 mount 命令确保 noauto 的东西在 geli 的情况下被挂载。有点丑陋,但对我来说,最重要的是,我可以远程登录并挽救我的桌面,避免断电后无法访问,否则这是默认模式!

相关内容