31/07/2018笔记

课堂笔记

1. Linux的隐藏权限

语法:chattr (change attributes)  [+-=] [Asaci]  [文件或者目录名]

        lsatter 可以用来查看隐藏权限

a:即append,设定该参数后,只能向文件中添加数据,而不能删除,多用于服务器日志文件安全,只有root才能设定这个属性。

i:设定文件不能被删除、改名、设定链接关系,同时不能写入或新增内容。i参数对于文件

注: >>,为追加

     >, 为覆盖写入, 例如 # echo 1232434 > /root/1.txt, 则1232434会覆盖原来1.txt中的内容

在实际工作中的实用,例如一些日志文件(eg. web service log 或者linux操作系统日志/var/log/messages),通常这些文件不允许删除做其他更改,但是需要追加新的内容,那么我们就可以设置“a”属性

2. 特殊权限

  • SUID

一个普通用户webgod去更新自己的密码时,使用的就是/usr/bin/passwd程序,却可以更新成功,而/usr/bin/passwd的拥有者是root。那么,就是说webgod这个普通用户可以访问/etc/shadow密码文件这既是因为有s权限的帮助

SUID仅可用在可执行的二进制文件(binary file),而且对目录无效。

注:二进制文件类似于windows下的.exe文件,C语言程序,经过编译,机器语言(由0101组成的二进制代码)汇编语言高级语言

  • SGID

   可以作用于目录

若目录被设置这个权限后,任何用户在此目录下创建的文件或者目录都具有和该目录所属组相同的组。

  • sticky bit

一般用于目录上,对文件的意义不大。

3. inode

  • inode是什么?

理解inode,要从文件储存说起。

文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。

操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。如果存储数据很小,可以把block设置小一些。

文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。

每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。

  • inode的内容

inode包含文件的元信息,具体来说有以下内容:

  * 文件的字节数

  * 文件拥有者的User ID

  * 文件的Group ID

  * 文件的读、写、执行权限

  * 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。

  * 链接数,即有多少文件名指向这个inode

  * 文件数据block的位置

可以用stat命令,查看某个文件的inode信息:

  stat example.txt

总之,除了文件名以外的所有文件信息,都存在inode之中。至于为什么没有文件名,下文会有详细解释。

  • inode的大小

inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。

每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。

查看每个硬盘分区的inode总数和已经使用的数量,可以使用df命令, # df -i

由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。这时可以删除不用的文件来释放inode

  • inode号码

每个inode都有一个号码,操作系统用inode号码来识别不同的文件。

这里值得重复一遍,Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。

表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据
 

4. # find

Find工具-name参数案列:

find /data/ -name "*.txt" #查找/data/目录以.txt结尾的文件;

find /data/ -name "[A-Z]*" #查找/data/目录以大写字母开头的文件;

find /data/ -name "test*" #查找/data/目录以test开头的文件;

find工具-perm参数案列:

find /data/ -perm 755 #查找/data/目录权限为755的文件或者目录;

find /data/ -perm -007 #与-perm 777相同,表示所有权限;

find /data/ -perm +644 #文件权限在644以上;

预习笔记

  • 用户配置文件和密码配置文件
  •  用户组管理
  • 用户管理
  • usermod命令
  • 用户密码管理
  •  mkpasswd命令
  • su命令
  • sudo命令
  • 限制root远程登录

1.用户配置文件和密码配置文件

  • 用户配置文件

文件 /etc/passwd, 输入 cat/etc/passwd来查看用户密码文件核心配置,创建的用户都会在此文件中增加一行

首先先来看一下文件结构,每个用户为一行,每一行用冒号分割为7段, 第一行为root,后面行是系统自带自己安装的用户,自己创建的用户则会在最后面依次显示

7段的详细信息如下:

1) 第一段是用户名

2)第三段和第四段表示user id 和group id

3)第二段,早期为密码,后因为不安全,现在用x代替, 密码存在另外的文件/etc/shadow

4)第五段为用户的注释信息,不太重要,经常为空

5)第六行为用户的家目录, root用户的家目录为/root/, 普通用户的家目录为/home/username/

6) 第七行为用户的shell,用户可以进行登录需要一个交互终端,常见为bin/bash/(用户可登录), /sbin/nologin(用户不可登陆)

  •  密码配置文件

      /etc/shadow和用户文件一一对应,第一行同为root,后面同为依次排列的自己创建的用户,用来控制用户密码的

        # cat /etc/shadow

也是用冒号分割成九段

1)第一段用户名

2)第二段用户密码,为加密,不可以反编译(不可以用加密密码得到明文密码),同时即使密码设置相同,加密也不同为唯一。如果为!!则为密码空;如果为*则为密码锁定不可用

注:如果想在一行中输入多个命令,可用分隔号隔开

3)第三段为天数,最后一次改密码距离1970年1月一号的天数,可以用来看出密码改动的时间

4)第四段表示要过多少天才可以更改密码

5)第五段表示密码在多少天内到期以及密码在多少天之内必须更改

6)第六段表示在密码过期提前多少天提醒用户密码到期

7)第七段表示在密码过期多少天后账户失效被锁定

8)第八段表示账号的生命周期,在1970年一月一号之后多少天内账号失效被锁定

9)第九段为保留文件,没有实际意义

2. 用户组管理

1)用#cat查看组文件 # cat /etc/group,文件内容和用户文件/etc/passwd没有完全对应上

创建用户时就会同时创建出跟用户名相同的用户组

2)/etc/gshadow, 为组密码的配置文件

注:如下图带减号的文件表示系统自动备份的文件,如果不小心删除了/etc/passwd & /ect/shadow & /etc/gourp & /etc/gshadow, 我们可以copy带”-“的文件,进行恢复。虽然有时因为sync的时间问题,有些出入,但影响不大

3)#groupadd

  • 可以创建用户组,语法为# groupadd 组

  • 可以创建指定用户id的用户组- # groupadd -g id number group name, CentoS7可以定义用户ID1000以上,1000以下为系统预留

4)# groupdel group name用来删除组,当用户组里有用户时,是不可删除用户组的。如下图所示,我们可以用# groupdel来删除grp1组,但是无法删除含有用户user1的用户组user1

3. 用户管理

1)# useradd, 来创建user2, #useradd user2, 普通用户的uid是从1000开始的,然后依次排序

2)创建普通用户时可以指定组和uid,输入# useradd -u id no. -g group name  user name,如下图所示

3)也可以指定user的家目录和shell, # useradd -u user id number -g group name -d 家目录 -s /.../... user name,

如下图,我们创建user4的时候指定了 uid -u 1006, 指定了组 by -g grp2,指定了用户家目录 by -d /home/aming111, 指定了shell by -s /sbin/nologin

4) # useradd -M user name, 可以用来创建用户但是不创建用户的家目录

如下图所示,我们用-M来制定在创建user5的时候不创建家目录,所以用ls查看/home/时就看不见user5的家目录

5)当创建用户,不指定任何参数时,user id依次自动增加;而group id则随着user id变化,与之前的gid无太大关系

6)# userdel 来删除用户以及与用户相关的信息,但是不会删除家目录-incase it will delete some important file by mistake, if adminstor considers file is useless, file can be deleted manually

  • But if you prefer to delete user and user home directory together, the # userdel -r user name can be used

4. Usermod-更改用户属性

1)# usermod 可以更改用户的user id(-u)、group id/group name (-g)、家目录 (-d)、shell(-s)

2)# useradd -G可以创建扩展组, 用# id user name可以查看出用户的uid/gid/组(所属组+扩展组)id。

一个用户可以属于多个组,但gid只有一个,除了gid之外其他的组叫做扩展组

# usemod -G group name user name, 可以指定用户的扩展组

同时也可以把user name加入多个扩展组,如下图所示

注:如果用# usermod -g来指定gid时,只能指定一个组,因为gid为唯一只有一个,不可以指定多个组

5. 用户密码管理

1)#passwd

如果为root用户,更改密码可直接输入# passwd, 回车,就可以更改; 如若更改普通用户的明码,# passwd user name

注:为一个用户更改密码也可以用# passwd --stdin usernam,与# passwd相比,只需要输入一次明文密码即可,不需要二次输入确认密码

  • 在以后写shell脚本中,设置用户密码可以如下

# echo xxxxx |passwd --stdin username (后者就不用再次输入新设置的密码,一条命令就可以更改用户的密码,不用交互), “|”为管道符,可以把前面命令的结果传输到后面的命令去

注:# echo的用法,# echo -e “xxxx\nxxxx”, 可以使输入的内容分行;# echo -e “xxxx\txxxx”, 可以使输入的内容分列

2)我们可以锁定一个用户的密码 # passwd -l username,例如# passwd -l aming, 再查看/etc/shadow,则可看见aming用户那一行第二段加密字符之前加了两个!!,就表示用户被锁定,无法登陆

注:用# usermod -L username也可以来锁定用户密码,在/ect/shadow中用户行第二段加密字符前只有一个!, 所以加密字符前只要有!就表明密码是锁定的,用户无法登陆

3)解除密码锁定# passwd -u username,例如# passwd -u aming, 再查看/etc/shadow就可以发现加密密码前!!不见了,用户可以登录了

注:# usermod -U username, 与# usermod -L相对应的可以解锁用户密码

6. mkpasswd (make password)

生成随机密码

1)在使用# mkpasswd命令之前,安装# yum install -y expect, 安装完成之后,使用# mkpasswd可以随机生成字符串来作为密码

2)我们可以通过加“-l 字符数”、“-s 特殊字符数”来指定自己需要的密码

例如我们用 # mkpasswd -l 12, 生成的密码就会含有12个字符

我们用# mkpass -s 3, 生成的密码中就含有三个特殊符号

在实际的应用,例如要生成100个用户给这一百个用户生成密码并记录,就可以用# mkpasswd 来生成随机密码

7. # su,用于切换用户

1)# su - username, 中间的“-”可以使得用户可以得到完全彻底切换包括自身的一些其他配置,如下图例子所示,当使用# user - aming时,我们通用查看用户ID,可以发现这是用户被完全从root切换到了aming,这时就可以加载aming用户自己的配置文件;而当我们只输入# user aming时,我们可以发现当前目录还是root。

root用户切换到普通用户时不需要密码,但是普通用户切换到root用户或其他用户时需要密码

2)# su  - -c ‘command’ username, 可以用来以指定某username的身份来执行某条命令,在执行完这个命令之后退出用户环境

如下图的例子,以aming用户的身份来执行一条命令,并不用登陆到aming用户下面去, # su - -c “touch /tmp/aming.111" aming, 用ls命令查看可以发现aming.111的所有者是aming

3) 如若某一用户没有家目录,这是用# su来转换时不能正常显示以username开头的命令行,会显示成“-bash-4.2”

如果想要正常显示,则需为用户新建一个家目录,并且把在模板目录下得/etc/skel/配置文件(.bash)copy到创建的家目录下,同时更改创建目录的所有者和所属组

如下图例子所示,因为创建user5的时候使用了# useradd -M 命令,user5的家目录没有被创建不存在,因此在切换到user5时,命令前缀显示不正常,如果想要改好需要如下步骤

  • 创建user5的家目录, # mkdir /home/user5
  • 此时/home/user5下面并没有配置文件,我们需要把在/etc/skel下的配置文件copy到/home/user5/下,以.bash开头的文件为隐藏的配置文件,# cp /etc/skel/.bash* /home/user5/
  • 然后我们在更改/home/usr5/的所属者和所属组, # chown -R (目录下有文件,级联改动) user 5: user 5 /home/user5
  • 此时再登陆就没有问题了

注: # su命令虽然便于操作可以使普通用户可以切换到root用户来实现系统管理,但也存在较大的安全风险,因为实现切换,普通用户必须知道root的密码,在现实生活中不能保证每个参与系统管理的普通用户都可以按正常流程来操作系统且 # su并没有设置普通用户权限的选项,因此# su不适合多人管理的情况,只适用于一两个人来管理的情况

8. # sudo 

1)针对普通用户而言

可以是普通用户临时以指定用户的的身份来执行一条命令,通常情况下是给普通用户授权root用户的身份。相较于# su, # sudo可以有针对性的下放给权限,并且约定哪些用户使用哪些工具来完成与其相关的工作

  • 首先# visudo, 来打开sudo的配置文件-/etc/sudoers(不建议使用#vi编辑,#visudo可以有错误提醒检测到语法错误),然后下翻,找到下图,图中的意思为允许root用户在任何地方使用任何命令

  • 我们可以模仿 root ALL=(ALL) ALL,来编辑对普通用户使用某些命令的root身份的授权,第一个ALL指在哪里,第二个ALL指用户,第三个ALL表示所有命令。例如,我们可以写成 aming ALL=(ALL) ALL or 命令所在的绝对路径

下图的格式不对

退出保存后,会出现错误提醒,如下图,按提示继续编辑文件

注:": set nu"可以标注出内容的行数

正确的写法,命令要用绝对路径,且用逗号和空格分隔

  • 然后我们用# su -,来转换到普通用户aming下,就可以使普通用户可以临时以root的身份进行之前设置命令了,这样就避免把root的密码给普通用户了同时也限制了普通用户的操作(可以限制where和哪些命令),更为安全

语法为# sudo 命令的绝对路径

我们也可以用# sudo -l 来查看可执行或禁止的命令

注: 在用visudo编辑时,可以在命令的绝对路径前加“NOPASSWD: ”, 那么在使用# sudo命令时则不需要输入普通用户的密码

注:

取消程序某类程序的执行,要在命令动作前面加上!号
例如 user5 ALL=(ALL)/usr/sbin/*,/sbin/*,!/usr/sbin/fdisk ,则表示user5用户被授权可以临时以root的身份运行/usr/sbin和/sbin下所有的程序,但fdisk 程序除外

2)在visudo中还有以下用法,可以设置主机、用户、组、命令的别名 ( Host_Alias、User_Alias、Runas_Alias、Cmnd_Alias),然后在编写## Allow root to run any commands anywhere时可以使用,如例子所示,因为AMING_CMD代表了ls、mv、cat三种命令,则我们可以 aming ALL=(ALL) AMING_CMD, 来使aming用户临时以root的身份使用ls,mv, cat的命令

3)针对用户组

仍然用# visudo,进行编辑,找到 ## Allows people in a group wheel to run all commands, 基本用法跟普通用户的用法相类似,把想要以root身份临时使用命令的用户放入一个组,对组在进行编辑

4) sudo -i: 为了频繁的执行某些只有超级用户才能执行的权限,而不用每次输入密码,可以使用该命令。提示输入密码时该密码为当前账户的密码。没有时间限制。执行该命令后提示符变为“#”而不是“$”。想退回普通账户时可以执行“exit”或“logout” 。

sudo -i 直接运行sudo命令加-i参数
sudo su 运行sudo命令给su命令提权,运行su命令。
sudo -i 运行结果 PWD=/root
sudo su 运行结果 PWD=/home/用户名(当前用户主目录)

9. 限制root远程登陆

1)处于安全方面的考虑,我们需要限制root远程登录

首先我们要编辑ssh配置文件, # vi /etc/ssh/sshd_config, 进入之后用“/”来搜索关键词 Root,找到#PermitRootLogin, 去掉#同时把yes 改成no,修改完配置文件后,重启配置文件# systemctl restart sshd.service, 就可以发现我们无法远程登陆root

2)在限制了root远程登录的前提下,但有时普通用户仍需要root的权限但又不知道root用户的登陆密码,可以使用# su- / # sudo来实现登录。因为以root的身份来 # su - root是不需要密码的,所以我们可以把一些用户的sudo配置改成可以以root的身份来使用# su -的命令,从而实现不知道密码也可以登录root

然后我们就可以在普通用户的登陆下使用# sudo su - root, 来切换到了root下


 


 

猜你喜欢

转载自blog.csdn.net/EM_F_Z/article/details/81342864