Jade Dungeon

用户管理与权限管理

取得用户信息

常用工具的区别

信息的类别 w who finger
用户名 V V V
终端标记(tty) V V V
登录的具体时间 V   V
登录的日期   V  
闲置时间 V   V
正在执行的程序 V    
从何外登录     V
占用CPU时间 V    
用户的全名(或其他从/etc/passwd得到的信息)     V
用户提供的个人信息     V
系统运行时间与负载 V    

查看已经登录的用户:who

显示用户名,连接的终端、登录的时间。

查看已经登录的用户:w

显示登录用户的更多多信息。

查看系统上的用户:finger

让人看到所有的用户会有安全隐患,所以管理员常常会禁用finger。

finger会显示系统上所有的用户。用finger加上指定用户名参数可以显示该用户的 更多信息。比如显示用户目录下的.plan.project文件的文本内容。

用户登录失败记录

# 查看失败登录记录,结果展示,跟上参数-xx,表示显示多少记录
$ lastb -20
root     ssh:notty    110.188.85.88    Tue Oct  5 10:46 - 10:46  (00:00)    
pi       ssh:notty    121.180.246.194  Mon Oct  4 10:53 - 10:53  (00:00)    
pi       ssh:notty    121.180.246.194  Mon Oct  4 10:53 - 10:53  (00:00)    
pi       ssh:notty    121.180.246.194  Mon Oct  4 10:53 - 10:53  (00:00)    
pi       ssh:notty    121.180.246.194  Mon Oct  4 10:53 - 10:53  (00:00)    
root     ssh:notty    110.188.84.142   Mon Oct  4 10:09 - 10:09  (00:00)    
root     ssh:notty    110.188.84.142   Mon Oct  4 10:09 - 10:09  (00:00)    
root     ssh:notty    125.70.165.6     Sun Oct  3 09:39 - 09:39  (00:00)    
db2inst1 ssh:notty    152.136.245.102  Sun Oct  3 09:00 - 09:00  (00:00)    
db2inst1 ssh:notty    152.136.245.102  Sun Oct  3 09:00 - 09:00  (00:00)    
db2inst1 ssh:notty    152.136.245.102  Sun Oct  3 08:57 - 08:57  (00:00)    
db2inst1 ssh:notty    152.136.245.102  Sun Oct  3 08:57 - 08:57  (00:00)    
db2inst1 ssh:notty    152.136.245.102  Sun Oct  3 08:55 - 08:55  (00:00)    
db2inst1 ssh:notty    152.136.245.102  Sun Oct  3 08:55 - 08:55  (00:00)    
rx       ssh:notty    152.136.245.102  Sun Oct  3 08:53 - 08:53  (00:00)    
rx       ssh:notty    152.136.245.102  Sun Oct  3 08:53 - 08:53  (00:00)    
rx       ssh:notty    152.136.245.102  Sun Oct  3 08:50 - 08:50  (00:00)    
rx       ssh:notty    152.136.245.102  Sun Oct  3 08:50 - 08:50  (00:00)    
rx       ssh:notty    152.136.245.102  Sun Oct  3 08:48 - 08:48  (00:00)    
rx       ssh:notty    152.136.245.102  Sun Oct  3 08:48 - 08:48  (00:00)    
  • 第一列为登录时所用的用户名
  • 第二列为登录方式(了解,具体含义可以参考以下摘要)
  • 第三列为登录客户端IP地址
  • 最后一列为登录时间。

登录失败用户加黑名单

从上面看到这些IP在一段时间内使用不同的用户名和密码在尝试登录服务器, 要是通过shell脚本的方式,统计出失败登录IP的次数,如果大于我们的设定值, 我们就把该IP放入黑名单中:


#!/bin/bash
#Denyhosts SHELL SCRIPT
# 分析登录日志文件,筛选失败登录并统计次存存入文件备用
cat /var/log/secure | awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $2"=" $1;}' >/root/Denyhosts.txt
# 定义允许失败登录的次数
DEFINE="10"
# 读取文件,并把条件范围内的IP写到hosts.deny中,实现黑名单效果
for i in `cat /root/Denyhosts.txt`
do
  IP=`echo $i|awk -F= '{print $1}'`
  NUM=`echo $i|awk -F= '{print $2}'`
  if [ $NUM -gt $DEFINE ]
  then
    ipExists=`grep $IP /etc/hosts.deny |grep -v grep |wc -l`
    if [ $ipExists -lt 1 ]
    then
      echo "sshd:$IP" >> /etc/hosts.deny
    fi
  fi
done

最后把文件保存并添加执行权限和定时任务,就可以自动的分析IP并加黑名单了。 让这些顽固分子知道我们管理员也是有做事的!

用户间通信

wall

对系统管理员来说一个最重要的命令.wall发送一条消息到大家登录端将其mesg权限 设置为yes。这条信息可以被wall作为参数,或者可以将它作为wall的标准输入。

[avishek@tecmint ~]$ wall "we will be going down for maintenance for one hour sharply at 03:30 pm"
Broadcast message from root@localhost.localdomain (pts/0) (Sat Jun 29 14:44:02 2013):
we will be going down for maintenance for one hour sharply at 03:30 pm

设置是否接收其他用户的消息:mesg

其他人们可以使用wtrite命令,将在在向您发送文本到屏幕上。你可以控制是否显示。

mesg [<strong>n</strong>|<strong>y</strong>] <strong>n</strong> - prevents the message from others popping up on the screen. <strong>y</strong> – Allows messages to appear on your screen.

发消息给其他用户:write

如果mesgy,就可以用write发消息给另一用户:

$ write todd

输入文本后,CONTROL + D结束文本。

如果是双方一来一回地对话,一般会类似于无线电呼叫,在文本中用o表示等待对方回复 (over),oo表示准备退出对话(over and out)。

消息的接收方会看到「Message from ...」的提示, 可以用CONTROL + L或是CONTROL + R来刷新屏幕并删除提示消息。 但是消息的发送者是谁要人工记下来。

talk

增强的write命令,talk命令可让你与其他登录的用户交谈。

[avishek@tecmint ~]$ talk ravisaive

管理用户

用户账号管理

usermod  [-u uid [-o]] [-g group] [-G group,...]
	[-d 主目录 [-m]] [-s shell] [-c 注释] [-l 新名称]
	[-f 失效日] [-e 过期日] [-p 密码] [-L|-U] 用户名

生成随机密码

对于下面的任何一种方法,你可以通过简单的修改来生成特定长度的密码,或者只使用其输出结果的前N位。希望你正在使用一些类似于LastPass的密码管理器,这样你就不用自己记住这些随机生成的密码了。

pwgen

常用的工具是pwgen,它能一下生成160个密码以8列20行打印出来。

$ pwgen
ameiK2oo aibi3Cha EPium0Ie aisoh1Ee Nidee9ae uNga0Bee uPh9ieM1 ahn1ooNg
oc5ooTea tai7eKid tae2yieS hiecaiR8 wohY2Ohk Uab2maed heC4aXoh Ob6Nieso
Shaeriu3 uy9Juk5u hoht7Doo Fah6yah3 faz9Jeew eKiek4ju as0Xuosh Eiwo4epo
oot8teeZ Ui1yoohi Aechae7A Ohdi2ael cae5Thoh Au1aeTei ais0aiC2 Cai2quin
Oox9ohz4 neev0Che ahza8AQu Ahz7eica meiBeeW0 Av3bo7ah quoiTu3f taeNg3ae
Aiko7Aiz SheiGh8E aesaeSh7 haet6Loo AeTel3oN Ath7zeer IeYah4ie UG3ootha
Ohch9Och Phuap6su iel5Xu7s diqui7Bu ieF2dier eeluHa1u Thagei0i Ceeth3oh
OCei1ahj zei2aiYo Jahgh1ia ooqu1Cej eez2aiPo Wahd5soo noo7Mei9 Hie5ashe
Uith4Or2 Xie3uh2b fuF9Eilu eiN2sha9 zae2YaSh oGh5ephi ohvao4Ae aixu6aeM
fo4Ierah iephei6A hae9eeGa eiBeiY3g Aic8Kee9 he8AheCh ohM4bid9 eemae3Zu
eesh2EiM cheiGa4j PooV2vii ahpeeg5E aezauX2c Xe7aethu Ahvaph7a Joh2heec
Ii5EeShi aij7Uo8e ooy2Ahth mieKe2ni eiQuu8fe giedaQu0 eiPhob3E oox1uo2U
eehia4Hu ga9Ahw0a ohxuZei7 eV4OoXio Kid2wu1n ku4Ahf5s uigh8uQu AhWoh0po
vo1Eeb2u Ahth7ve5 ieje4eiL ieci1Ach Meephie9 iephieY8 Eesoom7u eakai2Bo
uo8Ieche Zai3aev5 aGhahf0E Wowoo5th Oraeb0ah Gah3nah0 ieGhah0p aeCh0OhJ
ahQu2feZ ahQu0gah foik7Ush cei1Wai1 Aivi3ooY eephei5U MooZae3O quooRoh7
aequae5U pae6Ceiv eizahF1k ohmi7ETa ahyaeK1N Mohw2no8 ooc8Oone coo7Ieve
eePhei9h Weequ8eV Vie4iezu neeMiim4 ie6aiZoh Queegh2E shahwi3N Inichie8
Sid1aeji mohj4Ko7 lieDi0pe Zeemah6a thuevu2E phi4Ohsh paiKeix1 ooz1Ceph
ahV4yore ue2laePh fu1eThui qui7aePh Fahth1nu ohk9puLo aiBeez0b Neengai5

生成安全的随机密码,使用 pwgen 命令的 -s 选项。

$ pwgen -s
CU75lgZd 7HzzKgtA 2ktBJDpR F6XJVhBs UjAm3bNL zO7Dw7JJ pxn8fUvp Ka3lLilG
ywJX7iJl D9ajxb6N 78c1HOg2 g8vtWCra Jp6pBGBw oYuev9Vl gbA6gHV8 G6XQoVO5
uQN98IU4 50GgQfrX FrTsou2t YQorO4x6 UGer8Yi2 O7DB5nw1 1ax370UR 1xVRPkA1
RVaGDr2i Nt11ekUd 9Vm3D244 ck8Lnpd0 SjDt8uWn 5ERT4tf8 4EONFzyY Jc6T83jg
WZa6bKPW H4HMo1YU bsDDRik3 gBwV7LOW 9H1QRQ4x 3Ak7RcSe IJu2RBF9 e508xrLC
SzTrW191 AslxDa6E IkWWov2b iOb6EmTy qHt82OwG 5ZFO7B53 97zmjOPu A4KZuhYV
uQpoJR4D 0eKyOiUr Rz96smeO 3HTABu3N 6W0VmEls uPsp5zpw 8UD3VkMG YTct6Rd4
VKo0cVmq E07ZX7j9 kQSlvA69 Nm3fpv3i xWvF2xMu yEfcw8uA oQGVX3l9 grTzx7Xj
s4GVEYtM uJl5sYMe n3icRPiY ED3Mup4B k3M9KHI7 IkxqoSM0 dt2cxmMU yb2tUkut
2Q9wGZQx 8Rpo11s9 I13siOHu 7GV64Fjv 3VONzD8i SCDfVD3F oiPTx239 6BQakoiJ
XUEokiC4 ybL7VGmL el2RfvWk zKc7CLcE 3FqNBSyA NjDWrvZ5 KI3NSX4h VFyo6VPr
h4q3XeqZ FDYMoX6f uTU5ZzU3 6u4ob4Ep wiYPt05n CZga66qh upzH6Z9y RuVcqbe8
taQv11hq 1xsY67a8 EVo9GLXA FCaDLGb1 bZyh0YN8 0nTKo0Qy RRVUwn9t DuU8mwwv
x96LWpCb tFLz3fBG dNb4gCKf n6VYcOiH 1ep6QYFZ x8kaJtrY 56PDWuW6 1R0If4kV
2XK0NLQK 4XQqhycl Ip08cn6c Bnx9z2Bz 7gjGlON7 CJxLR1U4 mqMwir3j ovGXWu0z
MfDjk5m8 4KwM9SAN oz0fZ5eo 5m8iRtco oP5BpLh0 Z5kvwr1W f34O2O43 hXao1Sp8
tKoG5VNI f13fuYvm BQQn8MD3 bmFSf6Mf Z4Y0o17U jT4wO1DG cz2clBES Lr4B3qIY
ArKQRND6 8xnh4oIs nayiK2zG yWvQCV3v AFPlHSB8 zfx5bnaL t5lFbenk F2dIeBr4
C6RqDQMy gKt28c9O ZCi0tQKE 0Ekdjh3P ox2vWOMI 14XF4gwc nYA0L6tV rRN3lekn
lmwZNjz1 4ovmJAr7 shPl9o5f FFsuNwj0 F2eVkqGi 7gw277RZ nYE7gCLl JDn05S5N

假设你想要生成 5 个 14 字符长的密码,方法如下:

$ pwgen -s 14 5
7YxUwDyfxGVTYD em2NT6FceXjPfT u8jlrljbrclcTi IruIX3Xu0TFXRr X8M9cB6wKNot1e

如果你真的想要生成 20 个超强随机密码,方法如下:

$ pwgen -cnys 14 20
mQ3E=vfGfZ,5[B #zmj{i5|ZS){jg Ht_8i7OqJ%N`~2 443fa5iJ\W-L?] ?Qs$o=vz2vgQBR
^'Ry0Az|J9p2+0 t2oA/n7U_'|QRx EsX*%_(4./QCRJ ACr-,8yF9&eM[* !Xz1C'bw?tv50o
8hfv-fK(VxwQGS q!qj?sD7Xmkb7^ N#Zp\_Y2kr%!)~ 4*pwYs{bq]Hh&Y |4u=-Q1!jS~8=;
]{$N#FPX1L2B{h I|01fcK.z?QTz" l~]JD_,W%5bp.E +i2=D3;BQ}p+$I n.a3,.D3VQ3~&i

其他方式

1. 这种方法使用SHA算法来加密日期,并输出结果的前32个字符:

date +%s | sha256sum | base64 | head -c 32 ; echo

2. 这种方法使用内嵌的/dev/urandom,并过滤掉那些日常不怎么使用的字符。这里也只输出结果的前32个字符:

< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-32};echo;

3. 这种方法使用openssl的随机函数。如果你的系统也许没有安装openssl,你可以尝试其它九种方法或自己安装openssl。

openssl rand -base64 32

4. 这种方法类似于之前的urandom,但它是反向工作的。Bash的功能是非常强大的!

tr -cd '[:alnum:]' < /dev/urandom | fold -w30 | head -n1

5. 这种方法使用string命令,它从一个文件中输出可打印的字符串:

strings /dev/urandom | grep -o '[[:alnum:]]' | head -n 30 | tr -d '\n'; echo

6. 这是使用urandom的一个更简单的版本:

< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c6

7. 这种方法使用非常有用的dd命令:

dd if=/dev/urandom bs=1 count=32 2>/dev/null | base64 -w 0 | rev | cut -b 2- | rev

8. 你甚至可以生成一个只用左手便可以输入的密码:

</dev/urandom tr -dc '12345!@#$%qwertQWERTasdfgASDFGzxcvbZXCVB' | head -c8; echo ""

9. 如果每次都使用上述某种方法,那更好的办法是将它保存为函数。如果这样做了,那么在首次运行命令之后,你便可以在任何时间只使用randpw就可以生成随机密码。或许你可以把它保存到你的~/.bashrc文件里面。

randpw(){ < /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-16};echo;}

10. 最后这种生成随机密码的方法是最简单的。它同样也可以在安装了Cygwin的Windows下面运行。在Mac OS X下或许也可以运行。我敢肯定会有人抱怨这种方法生成的密码没有其它方法来的随机。但实际上如果你使用它生成的全部字符串作为密码,那这个密码就足够随机了。

date | md5sum

通过sudo改变权限

sudo影响环境变量

sudo运行时,会默认重置环境变量为安全的环境变量,也即,但前设置的变量都会失效, 只有少数配置文件中指定的环境变量能保存下来。

sudo的配置文件是/etc/sudoers需要root权限才能读取:

$ sudo sed '/^#/d;/^$/d' /etc/sudoers
Defaults env_reset
Defaults mail_badpass
Defaults secure_path=”/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin”
root ALL=(ALL:ALL) ALL
%sudo ALL=(ALL:ALL) ALL
xxx ALL=(ALL:ALL) NOPASSWD:ALL

不过可以直接通过sudo -l来查看sudo的限制:

$ sudo -l
Matching Defaults entries for xxx on this host:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User xxx may run the following commands on this host:
 (ALL : ALL) NOPASSWD: ALL
  • 注意看第一行的选项Defaults env_reset表示默认会将环境变量重置, 这样你定义的变量在sudo环境就会失效,获取不到。
  • 另外有的发行版还有一个Defaults env_keep=""的选项, 用于保留部分环境变量不被重置,需要保留的变量就写入双引号中。

为什么sudo echo $var能获取到变量值?

既然利用sudo执行会重置环境变量,那么为什么还能echo获取到相应的变量呢? 这是由于shell命令行的替换&重组功能,在输入命令,按下回车时, shell会先依据分隔符将命令行切割成字段,对每个字段查找有没有变量或命令替换, 再替换完成后,重组成新的命令,再去执行。所以,命令实际执行是:

$ sudo echo $var                   # $var => aaa
(sudo echo aaa)                    # 完成命令替换&重组
(echo aaa)                         # sudo环境中执行
aaa

因此,sudo环境重置后,并不用去引用$var这个变量,而是直接echo aaa

解决方案一:sudo -E

-E选项在man page中的解释是:

-E
   The -E (preserve environment) option indicates to the security policy that 
   the user wishes to preserve their existing environment variables. The security 
	 policy may return an error if the -E option is specified and the user does 
	 not have permission to preserve the environment.

简单来说,就是加上-E选项后,用户可以在sudo执行时保留当前用户已存在的环境变量, 不会被sudo重置,另外,如果用户对于指定的环境变量没有权限,则会报错。

$ sudo -E bash test.sh       # 加上-E参数后就可以获取到变量
aaa

解决方案二:修改sudo配置文件

在内部测试机器中,安全性要求不高,总是需要加上-E参数来执行脚本, 这个安全设定也不是很方便,可以通过visudo命令来修改配置为保留原有的环境变量, 具体修改如下:

$sudo visudo
# Defaults env_reset                  # 注释掉原有配置
# Defaults env_keep="..."               # 注释掉指定的变量保持
Defaults !env_reset                   # 修改为不重置环境

解决方案三:手动添加变量

手动在脚本中设置所需的变量,这样看起来比较麻烦,或者在执行sudo脚本前先将所需要 的变量写入到要执行的脚本开头。