Friday, October 12, 2018

管理 Linux 系统中的用户

管理 Linux 系统中的用户

也许你的 Lniux 用户并不是愤怒的公牛,但是当涉及管理他们的账户的时候,能让他们一直开心也是一种挑战。监控他们当前正在访问的东西,追踪他们他们遇到问题时的解决方案,并且保证能把他们在使用系统时出现的重要变动记录下来。这里有一些方法和工具可以使这份工作轻松一点。

配置账户

添加和移除账户是管理用户中最简单的一项,但是这里面仍然有很多需要考虑的选项。无论你是用桌面工具或是命令行选项,这都是一个非常自动化的过程。你可以使用命令添加一个新用户,像是 adduser jdoe,这同时会触发一系列的事情。使用下一个可用的 UID 可以创建 John 的账户,或许还会被许多用以配置账户的文件所填充。当你运行 adduser 命令加一个新的用户名的时候,它将会提示一些额外的信息,同时解释这是在干什么。
  1. $ sudo adduser jdoe
  2. Adding user 'jdoe' ...
  3. Adding new group `jdoe' (1001) ...
  4. Adding new user `jdoe' (1001) with group `jdoe' ...
  5. Creating home directory `/home/jdoe' ...
  6. Copying files from `/etc/skel' …
  7. Enter new UNIX password:
  8. Retype new UNIX password:
  9. passwd: password updated successfully
  10. Changing the user information for jdoe
  11. Enter the new value, or press ENTER for the default
  12. Full Name []: John Doe
  13. Room Number []:
  14. Work Phone []:
  15. Home Phone []:
  16. Other []:
  17. Is the information correct? [Y/n] Y
像你看到的那样,adduser 将添加用户的信息(到 /etc/passwd/etc/shadow 文件中),创建新的家目录,并用 /etc/skel 里设置的文件填充家目录,提示你分配初始密码和认定信息,然后确认这些信息都是正确的,如果你在最后的提示 “Is the information correct” 处的答案是 “n”,它将回溯你之前所有的回答,允许修改任何你想要修改的地方。
创建好一个用户后,你可能会想要确认一下它是否是你期望的样子,更好的方法是确保在添加第一个帐户之前,“自动”选择与您想要查看的内容相匹配。默认有默认的好处,它对于你想知道他们定义在哪里有所用处,以防你想作出一些变动 —— 例如,你不想家目录在 /home 里,你不想用户 UID 从 1000 开始,或是你不想家目录下的文件被系统上的每个人都可读。
adduser 如何工作的一些细节设置在 /etc/adduser.conf 文件里。这个文件包含的一些设置决定了一个新的账户如何配置,以及它之后的样子。注意,注释和空白行将会在输出中被忽略,因此我们可以更加集中注意在设置上面。
  1. $ cat /etc/adduser.conf | grep -v "^#" | grep -v "^$"
  2. DSHELL=/bin/bash
  3. DHOME=/home
  4. GROUPHOMES=no
  5. LETTERHOMES=no
  6. SKEL=/etc/skel
  7. FIRST_SYSTEM_UID=100
  8. LAST_SYSTEM_UID=999
  9. FIRST_SYSTEM_GID=100
  10. LAST_SYSTEM_GID=999
  11. FIRST_UID=1000
  12. LAST_UID=29999
  13. FIRST_GID=1000
  14. LAST_GID=29999
  15. USERGROUPS=yes
  16. USERS_GID=100
  17. DIR_MODE=0755
  18. SETGID_HOME=no
  19. QUOTAUSER=""
  20. SKEL_IGNORE_REGEX="dpkg-(old|new|dist|save)"
可以看到,我们有了一个默认的 shell(DSHELL),UID(FIRST_UID)的开始数值,家目录(DHOME)的位置,以及启动文件(SKEL)的来源位置。这个文件也会指定分配给家目录(DIR_HOME)的权限。
其中 DIR_HOME 是最重要的设置,它决定了每个家目录被使用的权限。这个设置分配给用户创建的目录权限是 755,家目录的权限将会设置为 rwxr-xr-x。用户可以读其他用户的文件,但是不能修改和移除他们。如果你想要更多的限制,你可以更改这个设置为 750(用户组外的任何人都不可访问)甚至是 700(除用户自己外的人都不可访问)。
任何用户账号在创建之前都可以进行手动修改。例如,你可以编辑 /etc/passwd 或者修改家目录的权限,开始在新服务器上添加用户之前配置 /etc/adduser.conf 可以确保一定的一致性,从长远来看可以节省时间和避免一些麻烦。
/etc/adduser.conf 的修改将会在之后创建的用户上生效。如果你想以不同的方式设置某个特定账户,除了用户名之外,你还可以选择使用 adduser 命令提供账户配置选项。或许你想为某些账户分配不同的 shell,请求特殊的 UID,完全禁用登录。adduser 的帮助页将会为你显示一些配置个人账户的选择。
  1. adduser [options] [--home DIR] [--shell SHELL] [--no-create-home]
  2. [--uid ID] [--firstuid ID] [--lastuid ID] [--ingroup GROUP | --gid ID]
  3. [--disabled-password] [--disabled-login] [--gecos GECOS]
  4. [--add_extra_groups] [--encrypt-home] user
每个 Linux 系统现在都会默认把每个用户放入对应的组中。作为一个管理员,你可能会选择以不同的方式去做事。你也许会发现把用户放在一个共享组中可以让你的站点工作的更好,这时,选择使用 adduser--gid 选项去选择一个特定的组。当然,用户总是许多组的成员,因此也有一些选项去管理主要和次要的组。

处理用户密码

一直以来,知道其他人的密码都是一个不好的念头,在设置账户时,管理员通常使用一个临时的密码,然后在用户第一次登录时会运行一条命令强制他修改密码。这里是一个例子:
  1. $ sudo chage -d 0 jdoe
当用户第一次登录的时候,会看到像这样的事情:
  1. WARNING: Your password has expired.
  2. You must change your password now and login again!
  3. Changing password for jdoe.
  4. (current) UNIX password:

添加用户到副组

添加用户到副组中,你可能会用如下所示的 usermod 命令 —— 添加用户到组中并确认已经做出变动。
  1. $ sudo usermod -a -G sudo jdoe
  2. $ sudo grep sudo /etc/group
  3. sudo:x:27:shs,jdoe
记住在一些组,像是 sudo 或者 wheel 组中,意味着包含特权,一定要特别注意这一点。

移除用户,添加组等

Linux 系统也提供了命令去移除账户、添加新的组、移除组等。例如,deluser 命令,将会从 /etc/passwd/etc/shadow 中移除用户登录入口,但是会完整保留他的家目录,除非你添加了 --remove-home 或者 --remove-all-files 选项。addgroup 命令会添加一个组,按目前组的次序给他下一个 ID(在用户组范围内),除非你使用 --gid 选项指定 ID。
  1. $ sudo addgroup testgroup --gid=131
  2. Adding group `testgroup' (GID 131) ...
  3. Done.

管理特权账户

一些 Linux 系统中有一个 wheel 组,它给组中成员赋予了像 root 一样运行命令的能力。在这种情况下,/etc/sudoers 将会引用该组。在 Debian 系统中,这个组被叫做 sudo,但是以相同的方式工作,你在 /etc/sudoers 中可以看到像这样的引用:
  1. %sudo ALL=(ALL:ALL) ALL
这个基础的设定意味着,任何在 wheel 或者 sudo 组中的成员,只要在他们运行的命令之前添加 sudo,就可以以 root 的权限去运行命令。
你可以向 sudoers 文件中添加更多有限的特权 —— 也许给特定用户运行一两个 root 的命令。如果这样做,您还应定期查看 /etc/sudoers 文件以评估用户拥有的权限,以及仍然需要提供的权限。
在下面显示的命令中,我们看到在 /etc/sudoers 中匹配到的行。在这个文件中最有趣的行是,包含能使用 sudo 运行命令的路径设置,以及两个允许通过 sudo 运行命令的组。像刚才提到的那样,单个用户可以通过包含在 sudoers 文件中来获得权限,但是更有实际意义的方法是通过组成员来定义各自的权限。
  1. # cat /etc/sudoers | grep -v "^#" | grep -v "^$"
  2. Defaults env_reset
  3. Defaults mail_badpass
  4. Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
  5. root ALL=(ALL:ALL) ALL
  6. %admin ALL=(ALL) ALL <== admin group
  7. %sudo ALL=(ALL:ALL) ALL <== sudo group

登录检查

你可以通过以下命令查看用户的上一次登录:
  1. # last jdoe
  2. jdoe pts/18 192.168.0.11 Thu Sep 14 08:44 - 11:48 (00:04)
  3. jdoe pts/18 192.168.0.11 Thu Sep 14 13:43 - 18:44 (00:00)
  4. jdoe pts/18 192.168.0.11 Thu Sep 14 19:42 - 19:43 (00:00)
如果你想查看每一个用户上一次的登录情况,你可以通过一个像这样的循环来运行 last 命令:
  1. $ for user in `ls /home`; do last $user | head -1; done
  2. jdoe pts/18 192.168.0.11 Thu Sep 14 19:42 - 19:43 (00:03)
  3. rocket pts/18 192.168.0.11 Thu Sep 14 13:02 - 13:02 (00:00)
  4. shs pts/17 192.168.0.11 Thu Sep 14 12:45 still logged in
此命令仅显示自当前 wtmp 文件变为活跃状态以来已登录的用户。空白行表示用户自那以后从未登录过,但没有将其调出。一个更好的命令是过滤掉在这期间从未登录过的用户的显示:
  1. $ for user in `ls /home`; do echo -n "$user ";last $user | head -1 | awk '{print substr($0,40)}'; done
  2. dhayes
  3. jdoe pts/18 192.168.0.11 Thu Sep 14 19:42 - 19:43
  4. peanut pts/19 192.168.0.29 Mon Sep 11 09:15 - 17:11
  5. rocket pts/18 192.168.0.11 Thu Sep 14 13:02 - 13:02
  6. shs pts/17 192.168.0.11 Thu Sep 14 12:45 still logged
  7. tsmith
这个命令会打印很多,但是可以通过一个脚本使它更加清晰易用。
  1. #!/bin/bash
  2. for user in `ls /home`
  3. do
  4. echo -n "$user ";last $user | head -1 | awk '{print substr($0,40)}'
  5. done
有时,此类信息可以提醒您用户角色的变动,表明他们可能不再需要相关帐户。

与用户沟通

Linux 提供了许多方法和用户沟通。你可以向 /etc/motd 文件中添加信息,当用户从终端登录到服务器时,将会显示这些信息。你也可以通过例如 write(通知单个用户)或者 wallwrite 给所有已登录的用户)命令发送通知。
  1. $ wall System will go down in one hour
  2. Broadcast message from shs@stinkbug (pts/17) (Thu Sep 14 14:04:16 2017):
  3. System will go down in one hour
重要的通知应该通过多个管道传递,因为很难预测用户实际会注意到什么。mesage-of-the-day(motd),wall 和 email 通知可以吸引用户大部分的注意力。

注意日志文件

更多地注意日志文件上也可以帮你理解用户活动。事实上,/var/log/auth.log 文件将会为你显示用户的登录和注销活动,组的创建等。/var/log/message 或者 /var/log/syslog 文件将会告诉你更多有关系统活动的事情。

追踪问题和请求

无论你是否在 Linux 系统上安装了票务系统,跟踪用户遇到的问题以及他们提出的请求都非常重要。如果请求的一部分久久不见回应,用户必然不会高兴。即使是纸质日志也可能是有用的,或者更好的是,有一个电子表格,可以让你注意到哪些问题仍然悬而未决,以及问题的根本原因是什么。确保解决问题和请求非常重要,日志还可以帮助您记住你必须采取的措施来解决几个月甚至几年后重新出现的问题。

总结

在繁忙的服务器上管理用户帐户部分取决于从配置良好的默认值开始,部分取决于监控用户活动和遇到的问题。如果用户觉得你对他们的顾虑有所回应并且知道在需要系统升级时会发生什么,他们可能会很高兴。

No comments:

Post a Comment

  How to Change Instance Type & Security Group of EC2 in AWS By David Taylor Updated April 29, 2023 EC2 stands for Elastic Compute Cloud...