1. Linux的安全性

Linux 安全系统的核心是用户账户。每个能进入 Linux 系统的用户都会被分配唯一的用户账户。用户对系统中各种对象的访问权限取决于他们登录系统时用的账户。

用户权限是通过创建用户时分配的用户 ID(User ID,通常缩写为 UID)来跟踪的。UID 是数值,每个用户都有唯一的 UID,但在登录系统时用的不是 UID,而是登录名。

1.1 etc/passwd 文件

Linux 系统使用一个专门的文件来将用户的登录名匹配到对应的 UID 值。这个文件就是 /etc/passwd文件。

$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
....
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
xfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologin
gdm:x:42:42::/var/gdm:/sbin/nologin
rich:x:500:500:Rich Blum:/home/rich:/bin/bash
mama:x:501:501:Mama:/home/mama:/bin/bash
katie:x:502:502:katie:/home/katie:/bin/bash
jessica:x:503:503:Jessica:/home/jessica:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
$

root 用户账户是 Linux 系统的管理员,固定分配给它的 UID 是 0。就像上例中显示的,Linux 系统会为各种各样的功能创建不同的用户账户,而这些账户并不是真的用户。这些账户叫作系统账户,是系统上运行的各种服务进程访问资源用的特殊账户。所有运行在后台的服务都需要用一个系统用户账户登录到 Linux 系统上。

Linux 为系统账户预留了 500 以下的 UID 值。

/etc/passwd文件的字段包含了如下信息:

  • 登录用户名
  • 用户密码
  • 用户账户的UID(数字形式)
  • 用户账户的组ID(GID)(数字形式)
  • 用户账户的文本描述(称为备注字段)
  • 用户HOME目录的位置
  • 用户的默认shell

/etc/passwd 文件中的密码字段都被设置成了 x,这并不是说所有的用户账户都用相同的密码。

绝大多数 Linux 系统都将用户密码保存在另一个单独的文件中(叫作 shadow 文件,位置在 /etc/shadow)。只有特定的程序(比如登录程序)才能访问这个文件。

1.2 /etc/shadow 文件

/etc/shadow 文件对 Linux 系统密码管理提供了更多的控制。只有 root 用户才能访问 /etc/shadow文件,这让它比起 /etc/passwd 安全许多。

/etc/shadow 文件为系统上的每个用户账户都保存了一条记录,如下所示:

rich:$1$.FfcK0ns$f1UgiyHQ25wrB/hykCn020:11627:0:99999:7:::

在 /etc/shadow 文件的每条记录中都有 9 个字段:

  • 与 /etc/passwd 文件中的登录名字段对应的登录名

  • 加密后的密码

  • 自上次修改密码后过去的天数密码(自1970年1月1日开始计算)

  • 多少天后才能更改密码

  • 多少天后必须更改密码

  • 密码过期前提前多少天提醒用户更改密码

  • 密码过期后多少天禁用用户账户

  • 用户账户被禁用的日期(用自1970年1月1日到当天的天数表示)

  • 预留字段给将来使用

使用 shadow 密码系统后,Linux 系统可以更好地控制用户密码。它可以控制用户多久更改一次密码,以及什么时候禁用该用户账户,

1.3 添加新用户

useradd 命令使用系统的默认值以及命令行参数来设置用户账户。系统默认值被设置在 /etc/default/useradd 文件中。可以使用加入了 -D 选项的 useradd 命令查看所用 Linux 系统中的这些默认值。

# /usr/sbin/useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
#

在创建新用户时,如果你不在命令行中指定具体的值,useradd 命令就会使用 -D 选项所显示的那些默认值。这个例子列出的默认值如下:

  • 新用户会被添加到 GID 为100的公共组;
  • 新用户的 HOME 目录将会位于 /home/loginname;
  • 新用户账户密码在过期后不会被禁用;
  • 新用户账户未被设置过期日期;
  • 新用户账户将 bash shell 作为默认 shell;
  • 系统会将 /etc/skel 目录下的内容复制到用户的 HOME 目录下;
  • 系统为该用户账户在 mail 目录下创建一个用于接收邮件的文件;

可以用默认系统参数创建一个新用户账户,然后检查一下新用户的 HOME 目录。

# useradd -m test
# ls -al /home/test
total 24
drwxr-xr-x 2 test test 4096 2010-09-23 19:01 .
drwxr-xr-x 4 root root 4096 2010-09-23 19:01 ..
-rw-r--r-- 1 test test 220 2010-04-18 21:51 .bash_logout
-rw-r--r-- 1 test test 3103 2010-04-18 21:51 .bashrc
-rw-r--r-- 1 test test 179 2010-03-26 08:31 examples.desktop
-rw-r--r-- 1 test test 675 2010-04-18 21:51 .profile
#

默认情况下,useradd 命令不会创建 HOME 目录,但是 -m 命令行选项会使其创建 HOME 目录。

要想在创建用户时改变默认值或默认行为,可以使用命令行参数,下图列出了这些参数。

在创建新用户账户时使用命令行参数可以更改系统指定的默认值。但如果总需要修改某个值的话,最好还是修改一下系统的默认值。

可以在 -D 选项后跟上一个指定的值来修改系统默认的新用户设置。参数列表如下图所示

更改默认值非常简单:

# useradd -D -s /bin/tsch
# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/tsch
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
# useradd命令会将tsch shell作为所有新建用户的默认登录shell。

1.4 删除用户

要删除用户可以使用 userdel 命令,默认情况下,userdel 命令会只删除 /etc/passwd 文件中的用户信息,而不会删除系统中属于该账户的任何文件。

如果加上 -r 参数,userdel 会删除用户的 HOME 目录以及邮件目录。然而,系统上仍可能存有已删除用户的其他文件。这在有些环境中会造成问题。

# /usr/sbin/userdel -r test
# ls -al /home/test
ls: cannot access /home/test: No such file or directory
#

1.5 修改用户

Linux提供了一些不同的工具来修改已有用户账户的信息。

  1. usermod

    usermod命令是用户账户修改工具中最强大的一个。它能用来修改/etc/passwd文件中的大部分字段,只需用与想修改的字段对应的命令行参数就可以了。参数大部分跟useradd命令的参数一样(比如,-c修改备注字段,-e修改过期日期,-g修改默认的登录组)。除此之外,还有另外一些可能派上用场的选项。

     -l 修改用户账户的登录名。
     -L 锁定账户,使用户无法登录。
     -p 修改账户的密码。
     -U 解除锁定,使用户能够登录。

  2. passwd 和 chpasswd

    改变用户密码的一个简便方法就是用passwd命令:

    # passwd test
    Changing password for user test.
    New UNIX password:
    Retype new UNIX password:
    passwd: all authentication tokens updated successfully.
    #
    

    如果只用 passwd 命令,它会改你自己的密码。系统上的任何用户都能改自己的密码,但只有root 用户才有权限改别人的密码。

    -e 选项能强制用户下次登录时修改密码。你可以先给用户设置一个简单的密码,之后再强制在下次登录时改成他们能记住的更复杂的密码。

    如果需要为系统中的大量用户修改密码,chpasswd 命令可以事半功倍。chpasswd 命令能从标准输入自动读取登录名和密码对(由冒号分割)列表,给密码加密,然后为用户账户设置。你也可以用重定向命令来将含有 userid:passwd 对的文件重定向给该命令。

    # chpasswd < users.txt
    #
    
  3. chsh、chfn 和 chage

    chsh 命令用来快速修改默认的用户登录 shell。使用时必须用 shell 的全路径名作为参数,不能只用 shell 名。

    # chsh -s /bin/csh test
    Changing shell for test.
    Shell changed.
    #
    

    chfn 命令提供了在 /etc/passwd 文件的备注字段中存储信息的标准方法。chfn 命令会将用于 Unix 的 finger 命令的信息存进备注字段,而不是简单地存入一些随机文本(比如名字或昵称之类的),或是将备注字段留空。finger 命令可以非常方便地查看 Linux 系统上的用户信息。

    # finger rich
    Login: rich Name: Rich Blum
    Directory: /home/rich Shell: /bin/bash
    On since Thu Sep 20 18:03 (EDT) on pts/0 from 192.168.1.2
    No mail.
    No Plan.
    #
    

    如果在使用 chfn 命令时没有参数,它会向你询问要将哪些适合的内容加进备注字段。

    # chfn test
    Changing finger information for test.
    Name []: Ima Test
    Office []: Director of Technology
    Office Phone []: (123)555-1234
    Home Phone []: (123)555-9876
    Finger information changed.# finger test
    Login: test Name: Ima Test
    Directory: /home/test Shell: /bin/csh
    Office: Director of Technology Office Phone: (123)555-1234
    Home Phone: (123)555-9876
    Never logged in.
    No mail.
    No Plan.
    #
    

    查看 /etc/passwd 文件中的记录,你会看到下面这样的结果。

    # grep test /etc/passwd
    test:x:504:504:Ima Test,Director of Technology,(123)555-
    1234,(123)555-9876:/home/test:/bin/csh
    #
    

    chage 命令用来帮助管理用户账户的有效期。

    chage命令的日期值可以用下面两种方式中的任意一种:

    • YYYY-MM-DD格式的日期
    • 代表从1970年1月1日起到该日期天数的数值

    chage 命令中有个好用的功能是设置账户的过期日期。有了它,你就能创建在特定日期自动过期的临时用户,再也不需要记住删除用户了!过期的账户跟锁定的账户很相似:账户仍然存在,但用户无法用它登录。

2. 使用Linux组

组权限允许多个用户对系统中的对象(比如文件、目录或设备等)共享一组共用的权限。

每个组都有唯一的 GID——跟 UID 类似,在系统上这是个唯一的数值。除了 GID,每个组还有唯一的组名。

/etc/group文件包含系统上用到的每个组的信息。

root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
adm:x:4:root,adm,daemon
rich:x:500:
mama:x:501:
katie:x:502:
jessica:x:503:
mysql:x:27:
test:x:504:

和 UID 一样,GID 在分配时也采用了特定的格式。系统账户用的组通常会分配低于 500 的 GID值,而用户组的 GID 则会从 500 开始分配。/etc/group 文件有 4 个字段:

​ * 组名
​ * 组密码
​ * GID
​ * 属于该组的用户列表

组密码允许非组内成员通过它临时成为该组成员。这个功能并不很普遍,但确实存在。

说明 用户账户列表某种意义上有些误导人。你会发现,在列表中,有些组并没有列出用户。这并不是说这些组没有成员。当一个用户在 /etc/passwd 文件中指定某个组作为默认组时,用户账户不会作为该组成员再出现在 /etc/group 文件中。多年以来,被这个问题难倒的系统管理员可不是一两个呢。

2.1 创建新组

groupadd 命令可在系统上创建新组。

# /usr/sbin/groupadd shared
# tail /etc/group
haldaemon:x:68:
xfs:x:43:
gdm:x:42:
rich:x:500:
mama:x:501:
katie:x:502:
jessica:x:503:
mysql:x:27:
test:x:504:
shared:x:505:
#

在创建新组时,默认没有用户被分配到该组。groupadd 命令没有提供将用户添加到组中的选项,但可以用 usermod 命令来弥补这一点。

# /usr/sbin/usermod -G shared rich
# /usr/sbin/usermod -G shared test
# tail /etc/group
haldaemon:x:68:
xfs:x:43:
gdm:x:42:
rich:x:500:
mama:x:501:
katie:x:502:
jessica:x:503:
mysql:x:27:
test:x:504:
shared:x:505:rich, test
#

shared 组现在有两个成员:test和rich。usermod 命令的 -G 选项会把这个新组添加到该用户账户的组列表里。

说明 如果更改了已登录系统账户所属的用户组,该用户必须登出系统后再登录,组关系的更改才能生效。

警告 为用户账户分配组时要格外小心。如果加了 -g 选项,指定的组名会替换掉该账户的默认组。-G 选项则将该组添加到用户的属组的列表里,不会影响默认组。

2.2 修改组

groupmod 命令可以修改已有组的 GID(加-g选项)或组名(加-n选项)。

# /usr/sbin/groupmod -n sharing shared
# tail /etc/group
haldaemon:x:68:
xfs:x:43:
gdm:x:42:
rich:x:500:
mama:x:501:
katie:x:502:
jessica:x:503:
mysql:x:27:
test:x:504:
sharing:x:505:test,rich
#
# 修改组名时,GID和组成员不会变,只有组名改变。

3. 理解文件权限

待续

4. 改变安全性设置

待续

Linux shell 学习笔记(5)— 文件权限(添加、修改、删除用户及创建、修改群组)相关推荐

  1. linux添加删除用户命令,Linux命令之useradd和userdel(添加、删除用户)

    一.[useradd]:添加用户命令 1.作用 useradd或adduser命令用来建立用户帐号和创建用户的起始目录,使用权限是超级用户. 2.格式 useradd [-d home] [-s sh ...

  2. Linux命令之useradd和userdel(添加、删除用户)

    一.[useradd]:添加用户命令 1.作用 useradd或adduser命令用来建立用户帐号和创建用户的起始目录,使用权限是超级用户. 2.格式 useradd [-d home] [-s sh ...

  3. Linux shell 学习笔记(1)— 文件和目录(查看、创建、复制、软硬链接、重命名及删除操作)

    1. 启动 shell /etc/passwd 文件包含了所有系统用户账户列表以及每个用户的基本配置信息: christine:x:501:501:Christine Bresnahan:/home/ ...

  4. Linux shell 学习笔记(11)— 理解输入和输出(标准输入、输出、错误以及临时重定向和永久重定向)

    1. 理解输入和输出 1.1 标准文件描述符 Linux 系统将每个对象当作文件处理.这包括输入和输出进程.Linux 用文件描述符(file descriptor)来标识每个文件对象.文件描述符是一 ...

  5. 【Linux】Linux Shell 学习笔记:什么是Linux?

    I Linux 简介 Linux系统简介 (biancheng.net) Linux和UNIX的关系及区别 (biancheng.net) Linux内核_百度百科 (baidu.com) [什么是 ...

  6. Linux shell 学习笔记(6)— vim 编辑器使用方法及技巧

    1. 检查 vim 软件包 1.1 CentOS 发行版 $ alias vi alias vi='vim' $ $ which vim /usr/bin/vim $ $ ls -l /usr/bin ...

  7. Linux shell 学习笔记(3)— shell 父子关系及内建命令

    1. shell 类型 只要用户登录到某个虚拟控制台终端或是在 GUI 中启动终端仿真器,默认的 shell 程序就会开始运行. 默认的交互 shell 会在用户登录某个虚拟控制台终端或在 GUI 中 ...

  8. Linux centOS学习笔记(文件处理命令)

    touch: [文件名] 在当前目录创建一个文件(文件名中有空格需要加双引号,不然会创建两个文件) [/路径/文件名] 在指定路径创建一个文件 cat: [/路径/文件名] 查看文件内容(不适合浏览长 ...

  9. Android学习笔记----SQLiteDatabase 自带添加、删除、更新、查询的操作方法:实现添加,删除,更新,查询,和分页,统计

    7.除了前面给大家介绍的execSQL()和rawQuery()方法, SQLiteDatabase还专门提供了对应 于添加.删除.更新.查询的操作方法: insert().delete().upda ...

最新文章

  1. 安装Ecshop首页出现报错:Only variables should be passed by referen
  2. 《用Python进行自然语言处理》第7章 从文本提取信息
  3. Dotnet 2.0配置系统
  4. java.time.format例子_java格式化时间示例
  5. phpcmsV9 QQ接入 - 线下phpsso应用管理 - 踩坑篇
  6. php如何上传txt文件,并且读取txt文件
  7. Quartz2D使用(截屏)
  8. DevOps冲击下的软件测试
  9. js 操作java对象_[Java教程]js 对象操作 对象原型操作 把一个对象A赋值给另一个对象B 并且对象B 修改 不会影响 A对象...
  10. 半车模型悬架系统的simulink仿真
  11. 可见的轮廓线用虚线绘制_机械制图国家标准规定,可见的轮廓线用虚线绘制。...
  12. PN结相关知识点(PN结原理)
  13. bzoj4816 [Sdoi2017]数字表格(反演)
  14. 数据字典动态生成下拉框
  15. Redis的数据变成backup
  16. 大数据-玩转数据-Python几种数据采集
  17. “最后的逆袭”----你可能只缺一份人工智能专家综合手册
  18. 操作系统--进程调度实验报告
  19. H3C对接外部Portal+Radius认证计费系统实现mac-trigger快速认证Mac无感知认证并结合L2TP实现阿里云部署对接配置
  20. 实战:618/双11大促备战全流程点点滴滴

热门文章

  1. ECS(Linux)连接RDS,使用命令行方式连接实例
  2. docker安装kafka消息队列
  3. 2022-2028年中国抗菌不锈钢行业研究及前瞻分析报告
  4. 2022-2028年中国抗盐粘土行业发展现状调查及前景战略分析报告
  5. Ubuntu 打 deb 包报错(fpm not found、dos2unix not found)
  6. Linux shell 学习笔记(7)— 构建基本脚本(变量、重定向、管道、状态码)
  7. jdk12‘javac‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  8. tensorflow学习笔记(二十五):ConfigProtoGPU
  9. 分治算法的设计思想(二分检索、二分归并排序)
  10. 面试高频——JUC并发工具包快速上手(超详细总结)