跳转到内容

UNIX 计算安全/访问授权

来自维基教科书,开放世界中的开放书籍
把你的密码当作你的牙刷一样对待。不要让其他人使用它,每六个月更换一次。
—克利福德·斯托尔

为了连接到基于 UNIX 的系统并执行活动,用户必须拥有一个帐户。该帐户必须具有唯一的数字标识符,该标识符与帐户名称或*用户名*相关联。该帐户还有一个*密码*,这是一个用户知道的字符串,当访问系统时,该字符串用于对帐户访问进行身份验证。*用户名*和*密码*通常足以将用户连接到系统。

用户可以在同一个系统上拥有多个帐户,或者在不同的系统上拥有帐户。如果帐户在同一个系统上,则每个帐户可以使用不同的名称,或者可以在多个系统上共享一个通用名称。根据运营系统的个人或机构,个人用户可能可以选择他们的帐户名称,或者他们可能被分配一个名称。通常,分配的名称将基于用户的真实姓名,并且将是系统上的唯一标识符。

*用户名*也是登录名,这意味着它是用户在提示登录时在键盘上键入的名称。在 UNIX 系统上,*用户名*的第一个字符必须是字母字符。字符的大小写很重要:“Joe1234”与“joe1234”是不同的登录名。在大多数情况下,帐户以小写字母开头,这是一个惯例。登录名的其余部分可以包含数字、字母字符或下划线。因此,星号或冒号字符对于登录名无效。具有这些特殊字符的帐户会导致某些系统功能出现问题,例如发送电子邮件。因此,这些字符通常在许多 UNIX 系统上被禁止。

UNIX 系统通常提供一组系统帐户来执行特殊操作。这些帐户可能包括诸如rootbinsyslpuucp之类的帐户。root帐户具有授予用户增强权限的特殊功能,因此通常会执行预防措施以防止未经授权的个人获取它。稍后将详细介绍。

/etc/passwd

[编辑 | 编辑源代码]

UNIX 帐户的信息存储在位于/etc/passwd的文本文件中。此文件包含每行一个帐户的信息,每行又细分为用冒号分隔的字段。字段的含义如下

登录名 帐户的文本名称
密码 单向散列加密的密码
用户 ID 帐户的唯一数字标识符
组 ID 帐户的默认组标识符
GECOS ID 以逗号分隔的用户信息的列表
主目录 用户的初始工作目录
shell 用于 shell 接口的程序

当用户获得帐户时,他们会获得一个默认密码,以便他们可以登录。当他们连接到系统时,系统会提示他们输入登录名,然后提示他们输入密码。如果系统配置正确,用户可以输入他们提供的密码,并且密码在键入时不会显示在屏幕上。(某些系统会为每个密码字符打印一个星号,而另一些系统则不会显示任何内容。)如果密码有效,用户将被允许访问系统。(系统可能会提示他们立即将密码更改为只有他们知道的密码。)

系统以加密形式将密码存储在/etc/passwd文件中。UNIX 使用一种称为单向散列的加密技术。这意味着密码是使用没有已知解密方法的技术进行加密的。也就是说,没有有效的办法可以根据加密字符串确定密码。

每次用户登录时,都会对其输入密码进行加密并与/etc/passwd文件中的加密进行比较。如果两者匹配,则允许用户访问。如果两者不匹配,则拒绝访问,并再次提示用户登录。(每个连接允许多次尝试,以防用户不小心输入了错误的登录名或密码。)请注意,密码也区分大小写,因此不小心忘记关闭caps-lock键可能会导致拒绝访问。

如果/etc/passwd文件存在格式错误,系统命令将无法读取文件中更低位置的条目。如果用户无法登录到系统,这可能是原因。(这就是为什么root帐户必须始终是第一个条目,以便系统管理员可以登录并解决passwd文件的问题。)UNIX 系统可以包含一个名为pwck的命令,该命令可以运行以检查passwd文件的格式问题。建议定期运行此命令,以确保不会引入潜在问题。

在编辑/etc/passwd文件时,vipw命令使用锁定机制来阻止另一个管理员同时编辑同一个文件。(同步编辑会导致来自一个操作员的更改覆盖来自另一个操作员的更改,这是一种不幸的情况,在多用户系统上没有文件锁定。)对于所有系统管理员来说,使用vipw命令是一个好习惯,假设他们精通vi的使用。

选择密码

[编辑 | 编辑源代码]

用户登录到系统后,可以使用passwd命令更改其密码。然后系统会提示用户输入其当前密码,然后会提示用户两次输入新密码选择。(重复提示是为了确保用户第一次没有意外地输入了错误的新密码。)新密码被接受后,加密的密码字段将更新到/etc/passwd文件中的用户帐户条目中。

密码是系统安全的重要组成部分,用于验证用户的身份。因此,必须选择密码,使其难以猜测。简单易猜的密码通常是未经授权访问的原因,并且存在一些程序可以通过尝试常见的密码来尝试访问系统。

以下是一些示例,说明典型密码可以使其相对容易猜测

  • 人的姓名
  • 他们孩子的姓名
  • 生日
  • 诸如“guess”或“password”之类的简单单词
  • 地名
  • 人的电话号码
  • 常见的键盘模式,例如“qwerty”
  • 计算机的名称
  • 反过来拼写的单词
  • 上面列出的内容之一,后面跟着一位数字

现代 UNIX 系统具有安全配置,在设置或更改密码时提供一定程度的强度检查。例如,密码可能需要至少八个字符长,并且包含一个或多个大写字母和小写字母、数字以及特殊字符(例如 *、$、#、%、&c)。这些措施可以使密码更难确定。在可能的情况下,建议实施此类功能,以确保选择强密码。

当用户在多个系统上拥有帐户时,他们可以选择在每个系统上使用相同的密码,以方便记忆。不幸的是,这意味着如果在一个系统上的密码被其他人确定,他们也可能能够获得对其他系统的未经授权的访问。除了教育用户并阻止在多个系统上使用密码之外,系统管理员很难防范这种可能性。

未经授权的登录尝试

[编辑 | 编辑源代码]

不幸的是,有些人可能会尝试通过尝试使用其他人的帐户来获得对系统的未经授权的访问。他们可能诉诸秘密手段从用户那里获得正确的登录信息,例如在登录期间观察他们在键盘上的操作,使用社会工程学诱使操作员或用户让他们访问,或者设置模拟正常登录的欺骗程序。

另一种获得未经授权访问的方法是尝试猜测登录名和密码。通常,登录名会在访问期间打印在屏幕上,因此该人可能已经知道帐户名称。但是,密码应该在屏幕上保持隐藏状态。但是,如果用户选择了弱密码,仍然可能能够猜测密码。

为了让猜测密码的任务更难,大多数UNIX系统在登录系统中内置了限制。第一个限制是在每次登录失败尝试之间设置时间延迟,这样每次尝试猜测的时间都会更长。另一个限制是限制登录尝试次数,超过次数后将断开会话。此外,登录失败的尝试会被记录在日志文件中,例如btmp。系统管理员可以定期检查日志文件,查看是否有异常的登录失败活动(例如一天内数百次尝试)。

除了帐户标识符之外,UNIX还可以根据组成员资格来限定对系统资源的访问权限。每个组可以包含多个帐户,而一个帐户可以属于一个或多个组。一个帐户将有一个默认组,它们属于该组,例如users,此信息存储在/etc/passwd文件中。

newgrp命令用于在不更改帐户的情况下切换您的组。只要组存在并且您的帐户属于该组,您就会被更改为选定的组名。现在您将拥有适合该组的访问权限。

该组用于管理由多人共享的信息或资源。它通常用于避免使用共享帐户的需要,这被认为是不安全的做法。在可能的情况下,系统管理员应要求使用组来提供对共享资源的访问权限,并避免使用共享帐户。有两个原因。首先,几乎不可能跟踪或审计共享帐户成员的活动。其次,更难终止特定个人对共享帐户的访问权限。

/etc/group

[编辑 | 编辑源代码]

UNIX组的信息存储在位于/etc/group的文本文件中。该文件每行包含一个组的信息,每行被细分为以冒号分隔的字段。字段的含义如下

组名 组的文本名称
密码 单向散列加密的密码
组 ID 帐户的默认组标识符
成员 以逗号分隔的组名列表

要属于除默认组之外的其他组,必须将帐户添加到相应的成员列表中。以下是一个/etc/group文件的简短示例

 root::0:root
 other::1:root
 bin::2:bin
 users::20:
 secrets::30:billy_bob,sally_sue,frederick

文件中的每一行都描述了一个组。在此示例中,帐户billy_bobsally_suefrederick都是secrets组的成员,即使它们的默认组是users。请注意,如果一个组有密码,即使用户不是成员,也可以使用密码更改到该组。

/etc/passwd文件的pwck命令一样,通常也提供一个grpck命令,可用于检查/etc/group文件的格式。建议使用此命令检查是否已引入格式错误。

标识符

[编辑 | 编辑源代码]

UNIX使用整数值来跟踪和存储访问信息。用户标识符或uid是与UNIX系统上用户的帐户相对应的标识符。该标识符由系统内部使用,用于确定潜在敏感数据和进程的所有权。当系统需要列出数据文件或进程的所有者时,它通常会将标识符映射回/etc/passwd文件中的帐户名称,然后显示信息。

uid的值通常可以从0到系统支持的最大整数减1。(负标识符,特别是-2,仅用于特殊用途。)

用户标识符通常从100开始分配,每个新帐户都通过分配以前未使用的标识符来添加。当某个帐户因某种原因被删除时,帐户条目将从/etc/passwd文件中删除。但是,这可能会导致该帐户创建的文件具有未分配的uid。随后创建的新帐户可能会被分配以前使用的uid,从而使该新用户成为先前帐户创建的文件的所有者。为了防止这种情况发生,系统管理员需要定期维护以查找缺少有效帐户的文件。

默认帐户

[编辑 | 编辑源代码]

在系统初始安装期间,供应商介质可以加载选定的默认帐户。这些帐户通常用于系统管理和维护。按照惯例,用户标识符0到99几乎总是为这些帐户保留,例如rootdaemonbinsys等等。在许多情况下,大多数这些帐户的密码都被禁用,并且uid用于系统文件或进程。

特别是root帐户,其uid为零 (0),是一个特殊帐户,它拥有比任何用户更高的权限。它通常被称为超级用户帐户。需要采取特殊预防措施来防止不适当的个人访问此帐户,并且UNIX系统的许多安全相关配置旨在防止这种情况发生。

在某些环境中,可能需要在多个操作员之间共享某些管理功能。当然,这样做会带来缺点,即当多人拥有超级用户访问权限时,维护安全系统的难度更大。当系统出现故障时,这也会使执行根本原因分析变得更加困难。

有几种方法可以帮助降低共享超级用户访问权限的风险,尽管它永远无法降至零。首先是配置系统,以便无法直接访问root帐户。相反,操作员必须使用其用户帐户登录,然后su(切换用户)到超级用户帐户。这可以提供有关何时以及由谁访问超级用户帐户的审计跟踪。它还有助于保护系统免受直接入侵超级用户帐户的尝试。相反,必须先破坏用户帐户,然后才能破坏超级用户帐户。

限制超级用户帐户访问权限要求的更复杂方法是通过使用基于角色的访问控制。这允许指定的用户帐户执行通常仅限于root帐户的一组有限操作。(例如,允许受信任的用户帐户修改服务器的打印机配置。)有很多工具可以使用,包括开源工具和供应商提供的工具,可用于提供基于角色的访问控制功能。本主题将在后面的章节中详细介绍。

影子密码文件

[编辑 | 编辑源代码]

虽然用户的密码在UNIX系统上以加密字符串的形式存储,但任何可以读取加密值的人都可以使用程序来测试各种常用的密码,看看它们是否匹配。也就是说,程序可以尝试一系列猜测并对其进行加密,看看它们是否与用户密码字段中的值匹配。程序还可以使用一个单词词典,对每个单词进行加密,并依次将它们与系统上的每个加密密码进行比较。

为了让猜测密码程序的这项任务更难一些,加密的密码包含一个随机的两位数“盐”。即使两个帐户的密码匹配,这个随机盐值也最有可能导致不同的加密字符串值。因此,程序必须重新计算每个猜测和每个帐户的加密字符串。尽管如此,现代UNIX系统仍然可以在相对较短的时间内处理大量猜测,这使得对密码仅由简单单词组成的系统进行暴力破解攻击变得非常可行。

当密码使用规则形成时,例如用数字分隔两个单词,任务就会变得稍微困难一些。但是,狡猾的人可能拥有大量的计算资源,因此猜测弱密码可能只是一个时间问题。(例如,一个这样的程序叫做crack,系统管理员可以使用它定期检查其用户的密码,以查找可猜测的值。)

为了阻止这种技术,加密的密码可以存储在单独的文件中,通常称为影子密码文件。只有root帐户可以读取影子密码文件的内容,并且/etc/passwd文件的密码字段被星号替换。此功能的实现将根据UNIX供应商而有所不同。影子密码位于Sun系统上的/etc/shadow以及HP-UX系统上的/tcb下。通过这种方式“遮蔽”加密密码,猜测密码的任务变得更加困难。

帐户管理

[编辑 | 编辑源代码]

正在建设中...

  • 文书工作和记录
  • 修改密码
  • 密码老化
  • 禁用帐户
华夏公益教科书