如何确保/ etc / pass中的/ etc / passwd中的gid也存在

时间:2014-12-01 21:03:13

标签: bash awk sed

背景:未分类的RHEL 6安全技术实施指南(STIG)是一份国防部指南,在(STID-ID)RHEL-06-000294中规定出现在/ etc / passwd中的所有用户主要GID必须存在于/ etc /中基。

不是运行推荐的'pwck -rq'命令并管道到日志然后强制管理员手动修复,更有意义的是以编程方式检查用户是否存在GID,如果不存在,只需将其设置为确实存在,例如“用户”或“无人”

我一直在反对这一点,并不能完全理解。我在sed,awk和grep的一些管道中输入sed或awk失败了。问题似乎是当我尝试嵌套命令时。我学会了awk不会在单行(或可能根本)中嵌套的困难方法。

更传统的循环的伪代码类似于:

# do while not EOF /etc/passwd
#   GIDREF = get 4th entry, sepparator ":" from line
#   USERNAMEFOUND = get first entry, separator ":" from line
#   grep ":$GIDREF:" /etc/group
#   if not found then
#      set GID for USERNAMEFOUND to "users"
#   fi
# end-do.

这看起来应该很简单,但我显然错过了一些东西。

感谢您的帮助。

-Kirk

2 个答案:

答案 0 :(得分:2)

列出/etc/passwd中不存在的/etc/group所有GID:

comm -23 <(awk -F: '{print $4}' /etc/passwd | sort -u) \
         <(awk -F: '{print $3}' /etc/group  | sort -u)

修复它们:

nogroup=$(awk -F: '($1=="nobody") {print $3}' /etc/group)
for gid in $(
 comm -23 <(awk -F: '{print $4}' /etc/passwd | sort -u) \
          <(awk -F: '{print $3}' /etc/group  | sort -u)); do
  awk -v gid="$gid" -F: '($4==gid) {print $1}' /etc/passwd | 
   xargs -n 1 usermod -g "$nogroup"
done

答案 1 :(得分:0)

我正在思考这些问题:

if ! grep "^$(groups $USERNAME | cut -d\  -f 1):" /etc/group > /dev/null; then
  usermod -g users $USERNAME
fi

其中

groups $USERNAME | cut -d\  -f 1

通过在第一个空格($USERNAME之前)和

分割groups $USERNAME的输出来给出:的主要组
grep ^foo: /etc/group

检查组foo是否存在。

编辑:修复代码:在空格处引用和拆分而不是冒号以允许grep模式中的附加冒号(否则,grep ^foo也会说组foo存在小组foobar)。