From a54e2a3aec0201c4e3e37f4c62f2b077a17b7f07 Mon Sep 17 00:00:00 2001 From: Vladimir Protsenko Date: Sat, 1 Oct 2022 18:51:59 +0400 Subject: [PATCH] Added missing solutions. --- 07_file_permissions/solutions.md | 212 +++++++++++++++++++++++++++++++ 09_nginx/solutions.md | 2 +- 11_cron_at/solutions.md | 132 +++++++++++++++++++ 11_cron_at/tasks.md | 2 +- 12_troubleshooting/solutions.md | 46 +++++++ 5 files changed, 392 insertions(+), 2 deletions(-) create mode 100644 11_cron_at/solutions.md create mode 100644 12_troubleshooting/solutions.md diff --git a/07_file_permissions/solutions.md b/07_file_permissions/solutions.md index e69de29..c1313a3 100644 --- a/07_file_permissions/solutions.md +++ b/07_file_permissions/solutions.md @@ -0,0 +1,212 @@ +# Решения + +### 1. +Создайте папку `projects` в корне системы с правами `rwx` для владельца, группы и других пользователей. Установите на неё `stickybit`. +``` +sudo mkdir /projects -m 1777 +``` + +### 2. +Работая от пользователя `stud` в папке `projects` создайте папку с вашим проектом. Проверьте, что владелец может записать файл в неё. Проверьте, что `mike` или `vera` могут прочитать содержимое, но не могу записать в неё. +``` +mike@stud15:/projects$ tree +. +└── project_stud + └── main.c + +1 directory, 1 file +mike@stud15:/projects$ cat project_stud/main.c +hello +mike@stud15:/projects$ touch project_stud/test +touch: cannot touch 'project_stud/test': Permission denied +``` + +### 3. +В `projects` создайте ещё одну папку с проектом `project2`. Дайте к ней доступ на чтение только пользователям из группы `best_project_team`. Создайте группу `best_project_team` в которую входит `mike` и `stud`. Перезайдите в аккаунт, чтоб применить изменения членства в группе. Проверьте, что доступа к папке у пользователя `vera` нет. +``` +stud@stud15:~$ sudo groupadd best_project_team +stud@stud15:~$ sudo usermod -aG best_project_team mike +stud@stud15:~$ sudo usermod -aG best_project_team stud +stud@stud15:~$ mkdir /projects/project2 +stud@stud15:~$ chmod 770 /projects/project2 +stud@stud15:~$ chown stud:best_project_team /projects/project2 +vera@stud15:~$ cat /projects/project2/testfile +``` + +### 4. +Создайте третью и четвёртую папки от пользователя `mike` и `vera` в `/projects` и сделайте их полностью приватными. Добавьте в каждую директорию по одному файлу. Проверьте может ли `mike` или vera посмотреть содержимое чужого приватного проекта. +``` +root@stud15:~# su - vera +vera@stud15:/projects$ mkdir /projects/vera_project +vera@stud15:/projects$ chmod 700 /projects/vera_project/ +vera@stud15:/projects$ echo "hello from vera" > /projects/vera_project/readme + +root@stud15:~# su - mike +mike@stud15:/projects$ mkdir mike_project +mike@stud15:/projects$ chmod 700 mike_project/ +mike@stud15:/projects/mike_project$ echo "hello from mike" > readme + +mike@stud15:/projects/mike_project$ cat /projects/mike_project/readme +hello from mike +mike@stud15:/projects/mike_project$ cat /projects/vera_project/readme +cat: /projects/vera_project/readme: Permission denied +``` + +### 5. +Проверьте может ли mike удалить папку с чужим проектом? Может ли он удалить свою папку? Уберите stickybit у папки /projects. А теперь может ли mike удалить папку, созданную vera или stud? Влияет ли на возможность удаления наличие в папке файлов? +```bash +mike@stud15:/projects/mike_project$ rm -rf /projects/vera_project/ +rm: cannot remove '/projects/vera_project/': Operation not permitted +mike@stud15:/projects/mike_project$ rm -rf /projects/mike_project/ +mike@stud15:/projects$ ls -la +total 20 +drwxrwxrwt 5 root root 4096 окт 1 17:59 . +drwxr-xr-x 21 root root 4096 окт 1 12:13 .. +drwxrwx--- 2 stud best_project_team 4096 окт 1 12:24 project2 +drwxr-xr-x 2 stud stud 4096 окт 1 12:16 project_stud +drwx------ 2 vera vera 4096 окт 1 17:54 vera_project + +# без файлов в директории vera_project +mike@stud15:~$ rm -rf /projects/vera_project/ +mike@stud15:~$ ls -l /projects/ +total 8 +drwxrwx--- 2 stud best_project_team 4096 окт 1 12:24 project2 +drwxr-xr-x 2 stud stud 4096 окт 1 12:16 project_stud +mike@stud15:~$ ls -l /projects/ +``` + +### 6. +От `root` cоздайте ещё одну общую директорию `shared` в `/home/`. Создайте группу `shared_files` c большим значением идентификатора, например 70000, в которую входят `mike`, `vera` и `stud`. Поменяйте владельца `/home/shared` на `nobody`, а владельца-группу на `shared_files`. Установите полные права доступа для владельца и группы владельца. Все остальным запретите доступ к папке. Также установите бит `SGID`. +```bash +root@stud15:/home# mkdir /home/shared +root@stud15:/home# groupadd shared_files --gid 70000 +root@stud15:/home# usermod -aG shared_files mike +root@stud15:/home# usermod -aG shared_files vera +root@stud15:/home# usermod -aG shared_files stud +root@stud15:/home# cat /etc/group | grep shared +shared_files:x:70000:stud,vera,mike +root@stud15:/home# ls -l | grep shared +drwxrws--- 2 nobody shared_files 4096 сен 9 16:43 shared +``` + +Создайте несколько файлов под разными аккаунтами в этой папке и проверьте, что они имеют владельца-группу shared_files. +```bash +root@stud15:/home# su --login mike --command "mkdir /home/shared/mike_data" +root@stud15:/home# su --login vera --command "mkdir /home/shared/vera_data" +root@stud15:/home# su --login stud --command "mkdir /home/shared/stud_data" +root@stud15:/home# ls -la shared/ +total 20 +drwxrws--- 5 nobody shared_files 4096 окт 1 18:26 . +drwxr-xr-x 13 root root 4096 сен 15 11:47 .. +-rw-r--r-- 1 stud shared_files 0 сен 9 16:42 1 +-rw-r--r-- 1 mike shared_files 0 сен 9 16:42 2 +-rw-rw-r-- 1 stud shared_files 0 сен 9 16:43 3 +drwxr-sr-x 2 mike shared_files 4096 окт 1 18:25 mike_data +drwxr-sr-x 2 stud shared_files 4096 окт 1 18:26 stud_data +drwxr-sr-x 2 vera shared_files 4096 окт 1 18:26 vera_data +``` + +### 7. +Узнайте значение `umask` одноимённой командой. Создайте папку и файл c именем `test_$(umask)`. Выведите атрибуты файла. Измените umask одноимённой командой на `0002`. Повторите создание папки и файла и сравните атрибуты файлов, созданных с разными масками. +```bash +stud@stud15:/home/shared$ umask +0022 +stud@stud15:/home/shared$ touch test_$(umask) +stud@stud15:/home/shared$ stat test_0022 + File: test_0022 + Size: 0 Blocks: 0 IO Block: 4096 regular empty file +Device: 801h/2049d Inode: 1177656 Links: 1 +Access: (0644/-rw-r--r--) Uid: ( 1000/ stud) Gid: ( 1002/shared_files) +Access: 2022-10-01 18:28:21.509800524 +0400 +Modify: 2022-10-01 18:28:21.509800524 +0400 +Change: 2022-10-01 18:28:21.509800524 +0400 + Birth: 2022-10-01 18:28:21.509800524 +0400 +stud@stud15:/home/shared$ umask 0002 +stud@stud15:/home/shared$ touch test_$(umask) +stud@stud15:/home/shared$ stat test_0002 + File: test_0002 + Size: 0 Blocks: 0 IO Block: 4096 regular empty file +Device: 801h/2049d Inode: 1177657 Links: 1 +Access: (0664/-rw-rw-r--) Uid: ( 1000/ stud) Gid: ( 1002/shared_files) +Access: 2022-10-01 18:28:45.002074124 +0400 +Modify: 2022-10-01 18:28:45.002074124 +0400 +Change: 2022-10-01 18:28:45.002074124 +0400 + Birth: 2022-10-01 18:28:45.002074124 +0400 +``` + +### 8. +Под `root` скопируйте `bash` `cp /bin/bash /bin/my_unsecure_bash` и установите атрибуты файла в значение `4755`. Значение 4 соответствует биту `SUID`. Посмотрите на результат командой `stat`. Создайте файл-скрипт `gen_file_root.sh` в папке `/tmp` от пользователя `mike` со следующим содержимым: +```bash +#!/bin/my_unsecure_bash -p +touch /tmp/root_$RANDOM +``` +Сделайте его исполняемым для всех. Вызовите скрипт от пользователя `stud`. Обратите внимание на владельца созданного файла `/tmp/root_*`. Как на него повлиял `SUID`? Установите `SUID` на `gen_file_root.sh`, сгенерируйте новый файл. Есть ли изменения в поле владельца? +``` +root@stud15:/tmp# stat /bin/my_unsecure_bash + File: /bin/my_unsecure_bash + Size: 1234376 Blocks: 2416 IO Block: 4096 regular file +Device: 801h/2049d Inode: 1842926 Links: 1 +Access: (4755/-rwsr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) +Access: 2022-09-09 15:07:30.407667000 +0400 +Modify: 2022-09-09 15:04:36.207672558 +0400 +Change: 2022-09-09 15:04:59.031671752 +0400 + Birth: 2022-09-09 15:04:36.171672558 +0400 +root@stud15:/tmp# chmod 777 /tmp/gen_file_root.sh +root@stud15:/tmp# su - stud + +stud@stud15:~$ cd /tmp/ +stud@stud15:/tmp$ ./gen_file_root.sh +stud@stud15:/tmp$ ./gen_file_root.sh +stud@stud15:/tmp$ ./gen_file_root.sh +stud@stud15:/tmp$ ls -l +total 16 +-rwxrwxrwx 1 root root 51 окт 1 18:33 gen_file_root.sh +-rw-r--r-- 1 stud stud 33 окт 1 11:34 log +-rw-r--r-- 1 root stud 0 окт 1 18:39 root_29247 +-rw-r--r-- 1 root stud 0 окт 1 18:39 root_32039 +-rw-r--r-- 1 root stud 0 окт 1 18:39 root_9235 +``` + +### 9. +В каталоге `/projects` cоздайте файл `test` в папках `1`, `2`, `3`. Поменяйте для папок атрибуты доступа для категории `other`: `r--`, `r-x`, `--x` соответственно. Зайдите под другого пользователя, который входит в категорию `other` и попробуйте найти файл с помощью `find`, начиная с каталога `/projects`. Попробуйте найти слово в содержимом файлов. Как влияют атрибуты на возможность поиска? +``` +stud@stud15:/projects$ mkdir 1 +stud@stud15:/projects$ mkdir 2 +stud@stud15:/projects$ mkdir 3 +stud@stud15:/projects$ chmod 704 1 +stud@stud15:/projects$ chmod 705 2 +You have new mail in /var/mail/stud +stud@stud15:/projects$ chmod 701 3 +stud@stud15:/projects$ ls -l +total 20 +drwx---r-- 2 stud stud 4096 окт 1 18:42 1 +drwx---r-x 2 stud stud 4096 окт 1 18:42 2 +drwx-----x 2 stud stud 4096 окт 1 18:42 3 +stud@stud15:/projects$ echo "hello" > 1/message +stud@stud15:/projects$ echo "hello" > 2/message +stud@stud15:/projects$ echo "hello" > 3/message + +root@stud15:/tmp# su - mike +mike@stud15:~$ cd /projects/ +mike@stud15:/projects$ find . -name "message" +find: ‘./3’: Permission denied +./2/message +./1/message +mike@stud15:/projects$ grep -r "hello" . +grep: ./3: Permission denied +./2/message:hello +grep: ./1/message: Permission denied +``` +Команда `find` не смогла найти файл только для папки без доступа на чтение для `other`. Команда `grep` смогла найти строку только в папке с правами и на чтение и на исполнение. + +# Справка + +Конфигурационные файлы: +- /etc/login.defs + +Команды: +- stat +- ls -l +- chmod +- chown +- umask \ No newline at end of file diff --git a/09_nginx/solutions.md b/09_nginx/solutions.md index 59d3a38..d5e5624 100644 --- a/09_nginx/solutions.md +++ b/09_nginx/solutions.md @@ -48,7 +48,7 @@ $ sudo systemctl status nginx ``` ### 6. -``` +```bash $ cat /etc/nginx/nginx.conf user www-data; worker_processes auto; diff --git a/11_cron_at/solutions.md b/11_cron_at/solutions.md new file mode 100644 index 0000000..4a8fd3d --- /dev/null +++ b/11_cron_at/solutions.md @@ -0,0 +1,132 @@ +# Решения + +Для проверки расписания вы можете использовать сайт https://crontab.guru/, https://cronheatmap.com и аналоги. + +### 0. +Проверьте наличие команд cron и at в системе. Установите их в случае отсутствия. +```bash +sudo apt install cron at +``` + +### 1. +Выведите документацию crontab и cron. +```bash +man crontab +man cron +``` + +### 2. +Создайте cron расписание для выполнения скрипта или к: +``` bash +# ┌───────────── minute (0 - 59) +# │ ┌───────────── hour (0 - 23) +# │ │ ┌───────────── day of the month (1 - 31) +# │ │ │ ┌───────────── month (1 - 12) +# │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday; +# │ │ │ │ │ 7 is also Sunday on some systems) +# │ │ │ │ │ +# │ │ │ │ │ +# * * * * * + +# 1. дважды в день: в 5 утра и в 5 вечера, +0 5,17 * * * /sbin/script.sh +# 2. в 3:15 каждый день, +15 15 * * * /sbin/script.sh +# 3. в 8 вечера каждую неделю, +0 20 * * 1 /sbin/script.sh +# 4. по понедельникам в 20:00, +0 20 * * 1 /sbin/script.sh +# 5. в 20:00 по понедельникам и по субботам, +0 20 * * 1,6 /sbin/script.sh +# 6. каждую минуту, +* * * * * /sbin/script.sh +# 7. каждые 10 минут, +*/10 * * * * /sbin/script.sh +# 8. каждые 15 минут по субботам и понедельникам, +*/15 * * * 1,6 /sbin/script.sh +# 9. каждую минуту в марте, июне, сентябре и декабре, +* * * 3,6,9,12 /sbin/script.sh +# 10. 20 января в 8 вечера, +0 20 20 1 * /sbin/script.sh +# 11. ежедневное выполнение скрипта в 8 вечера каждый второй месяц, +0 20 * */2 * /sbin/script.sh +# 12. *в первое воскресенье каждого месяца, +0 0 * * 0 [ $(date +%d) -le 07 ] && /script/script.sh +# 13. каждые три часа, +0 */3 * * * /sbin/script.sh +# 14. дважды, каждую субботу и понедельник, +0 0 * * 1,6 /sbin/script.sh +# 15. *каждые 30 секунд, +* * * * * /sbin/script.sh +* * * * * sleep 30; /sbin/script.sh +# 16. каждый день в летний период, +0 0 * 6,7,8 * /sbin/script.sh +# 17. для рассылки поздравлений с новым годом, +0 0 1 1 * /sbin/happy_new_year_mail.sh +# 18. ежедневного удаления неиспользуемых пакетов в системе, +0 1 * * * apt autoremove +# 19. перезапуска системы в 0 часов 0 минут, +0 0 * * * shutdown -h 0 +# 20. для очистки всех попыток сбоя входа в систему ежедневно в 1:00, +0 1 * * * /sbin/clear_auth_errors.sh +# 21. ежедневной проверки и загрузки новых системных пакетов, +0 0 * * * apt update +# 22. ежедневного обновления пакетов системы, +0 0 * * * apt upgrade -y +# 23. ежедневное резервное копирование всех папок пользователей в 5 утра. +0 5 * * * tar -zcf /var/backups/home.tgz /home/ +``` +### 3. +Создайте задание в котором отчёты cron будут отправляться вам на внешний почтовый ящик. +``` +MAILTO=logs@myoffice.org +``` + +### 4. +Установите пользовательский сrontab. +``` +sudo echo "stud" >> /etc/cron.allow +crontab -e +``` + +### 5. +Настройте выполнение исполняемого файла script.sh из `/usr/sbin/` каждую среду, модифицировав `PATH` в cron задании. +```bash +PATH=/opt/cmake/bin:$PATH +0 0 * * 3 /usr/sbin/script.sh +``` + +### 6. +Пользуясь полномочиями суперпользователя, запретите пользователю mike выполнять команду at. +``` +sudo echo "mike" >> /etc/at.deny +``` + +### 7. +Запланируйте командой at: +``` bash +# 1. выполнение скрипта сегодня в 9 часов, +at 21:00 script.sh +# 2. перезагрузку через 2 часа, +sudo at now + 2 hours reboot +# 3. выполнение команды через 100 лет. +at now + 100 years script.sh +``` + +# Справка + +Релевантные файлы: + - /etc/cron.allow + - /etc/cron.deny + - /var/spool/cron/crontabs + - /var/spool/cron/atjobs + - /var/spool/cron/atspool + - /proc/loadavg + - /var/run/utmp + - /etc/at.allow + - /etc/at.deny + +Релевантные команды: + - cron + - at + - crontab \ No newline at end of file diff --git a/11_cron_at/tasks.md b/11_cron_at/tasks.md index 21c0f1f..985c994 100644 --- a/11_cron_at/tasks.md +++ b/11_cron_at/tasks.md @@ -3,7 +3,7 @@ Для проверки расписания вы можете использовать сайт https://crontab.guru/, https://cronheatmap.com и аналоги. ### 0. -Проверьте наличие команд cron и at в систем. Установите их в случае отсутствия. +Проверьте наличие команд cron и at в системе. Установите их в случае отсутствия. ### 1. Выведите документацию crontab и cron. diff --git a/12_troubleshooting/solutions.md b/12_troubleshooting/solutions.md new file mode 100644 index 0000000..5bad1ee --- /dev/null +++ b/12_troubleshooting/solutions.md @@ -0,0 +1,46 @@ +# Решения + +Исправьте проблемы настройки сети в виртуальных машинах `troublesome-X-task[1-5]`. В каждой машине 1 проблема после исправления которой работает команда `ping yandex.com`. Шлюз по умолчанию для машины в каждом задании - 192.168.1.1 в сети 192.168.1.0/24. Всего 5 заданий. Используйте механизм снимков и команду rollback в proxmox интерфейсе, чтобы откатывать машину в первоначальное состояние. + +### 1. Не активирован и не запущен systemd-networkd +``` +sudo systemctl enable systemd-networkd +sudo systemctl start systemd-networkd +``` + +### 2. В настройках не указан шлюз по умолчанию +``` +sudo "echo Gateway=192.168.1.1 >> /etc/systemd/network/ens18.network" +sudo networkctl reload +``` + +### 3. В настройках systemd-resolved не указан DNS +``` +sudo "echo DNS=1.1.1.1 >> /etc/systemd/resolved.conf" +sudo systemctl restart systemd-resolved +``` + +### 4. Машина находится в другой сети по отношению к шлюзу +``` +sudo sed 's/172\.16/192\.168/' -i /etc/systemd/network/ens18.network +sudo networkctl reload +``` + +### 5. На сетевом интерфейсе установлен MAC-дубликат шлюза +Установите родной mac `permaddr`: +``` +sudo "ip link set address $(ip link show ens18 | grep permaddr | awk '{ print $6 }') dev ens18" +``` + +### 6. Неверные права папки .ssh пользователя mike + +В 6ом задании `troublesome-X-task6` вам требуется отладить команду `ssh localhost -l mike`, запущенную от пользователя stud. Команда должна отработать без ввода пароля. + +``` +sudo chmod 0700 /home/mike/.ssh +``` + +Также желательно исправить группу-владельца: +``` +sudo chown mike:mike /home/mike/.ssh +``` \ No newline at end of file