54 lines
2.2 KiB
Bash
54 lines
2.2 KiB
Bash
mode() { stat -c %a "$1" 2>/dev/null; }
|
|
readable_file() {
|
|
local f
|
|
for f in /srv/test/*; do
|
|
[ -f "$f" ] && runuser -u tess -- cat "$f" >/dev/null 2>&1 && return 0
|
|
done
|
|
return 1
|
|
}
|
|
# Files in /srv/web from anna and from ben, all in group web and
|
|
# group-writable.
|
|
web_files() {
|
|
local f a=0 b=0
|
|
for f in /srv/web/*; do
|
|
[ -f "$f" ] || continue
|
|
[ "$(stat -c %G "$f")" = web ] || return 1
|
|
case $(stat -c %U "$f") in anna) a=1 ;; ben) b=1 ;; esac
|
|
[ $(( $(mode "$f") / 10 % 10 & 2 )) -ne 0 ] || return 1
|
|
done
|
|
[ $a = 1 ] && [ $b = 1 ]
|
|
}
|
|
in_web() { id -nG "$1" 2>/dev/null | grep -qw web; }
|
|
setid_ok() {
|
|
local f n=0 all
|
|
for f in $(grep -oE '/[^[:space:]]+' /root/lab-answers/5 2>/dev/null); do
|
|
[ -u "$f" ] || [ -g "$f" ] || return 1
|
|
n=$((n + 1))
|
|
done
|
|
grep -Eq '/bin/passwd([[:space:]]|$)' /root/lab-answers/5 || return 1
|
|
all=$(find / -xdev -type f -perm /6000 2>/dev/null | wc -l)
|
|
[ "$n" -ge $((all * 8 / 10)) ]
|
|
}
|
|
|
|
task 1 "report.txt: owner reads and writes, group reads, others nothing"
|
|
need "/root/perm/report.txt has mode 640" '[ "$(mode /root/perm/report.txt)" = 640 ]'
|
|
need "/root/lab-answers/1 has the mode" '[ "$(answer 1 | sed "s/^0*//")" = 640 ]'
|
|
|
|
task 2 "/srv/test: mode 711, its file readable by path only"
|
|
need "/srv/test has mode 711" '[ "$(mode /srv/test)" = 711 ]'
|
|
need "tess can cat a file in it by its full path" readable_file
|
|
need "tess can't list it" '! runuser -u tess -- ls /srv/test'
|
|
|
|
task 3 "Files and directories made under umask 077 and 033"
|
|
need "f077 has mode 600 and d077 mode 700" '[ "$(mode /root/perm/f077)" = 600 ] && [ "$(mode /root/perm/d077)" = 700 ]'
|
|
need "f033 has mode 644 and d033 mode 744" '[ "$(mode /root/perm/f033)" = 644 ] && [ "$(mode /root/perm/d033)" = 744 ]'
|
|
|
|
task 4 "/srv/web shared by anna and ben, mode 3770"
|
|
need "group web has anna and ben" 'in_web anna && in_web ben'
|
|
need "/srv/web belongs to group web" '[ "$(stat -c %G /srv/web)" = web ]'
|
|
need "/srv/web has mode 3770 (setgid and sticky)" '[ "$(mode /srv/web)" = 3770 ]'
|
|
need "anna and ben each have a file in it, in group web and group-writable" web_files
|
|
|
|
task 5 "Setuid and setgid programs listed"
|
|
need "/root/lab-answers/5 lists the setuid and setgid programs, passwd among them" setid_ok
|