Предварительная информация:
Конкурсное задание Олимпиады IT-Планета-2015 в номинации Администрирование GNU/Linux выполняется участником на виртуальном сервере, подключенном к сети Интернет. Организаторы предустанавливают дистрибутив Debian GNU/Linux на виртуальных серверах участников в конфигурации по умолчанию, выбор остального используемого ПО (за исключением оговоренного в заданиях) остается целиком на усмотрение участника.
После регистрации каждому участнику высылается его номер и пароль пользователя tester от конкурсного компьютера.
Строкой ### (три «решётки») в дальнейшем обозначается номер участника -- последовательность из 3 цифр, идентифицирующая участника.
По окончании выполнения всех частей задания участник должен оповестить сервер Олимпиады об этом, для чего со своей конкурсной машины необходимо выполнить команду "ssh [email protected]" (пароль: done). Не выполняйте эту команду "просто для проверки"! Если серверу удастся подключиться в ответ к Вашей конкурсной машине, она будет отправлена в перезагрузку. Если перезагрузки не произошло, проверьте, что sshd запущен и слушает 22-й порт, что этот порт не блокируется, и у пользователя root Вашей конкурсной машины верно прописан нужный публичный ключ (см. текст заданий ниже). Результаты проверки будут опубликованы после окончания конкурса.
Оргкомитет и жюри оставляют за собой право связаться с участником по видеосвязи (skype) либо по телефону по своему усмотрению и задать дополнительные вопросы для уточнения подробностей выполнения задания. В случае, если участник не покажет знания подробностей выполненных заданий, он снимается с конкурса.
Если пакеты из репозитория скачиваются слишком медленно, воспользуйтесь более быстрым зеркалом. Например, mirror.yandex.ru.
Доступ к учётной записи root осуществляется с тем же паролем, что и для учётной записи tester.
Предварительное задание (без баллов):
Создать в домашнем каталоге пользователя tester на Вашей конкурсной машине файл user.txt и вписать в него в кодировке UTF-8 пять строк:
Ф.И.О. участника (полностью)
Название учебного заведения (полностью, без сокращений)
Контактный телефон
Контактный e-mail
Номер участника
Конкурсные задания:
ssh (1 балл)
Запретить пользователю root возможность подключаться, используя пароль. ключ следует получить по адресу: https://olimp.site.ru/key (без корректного выполнения этого задания дальнейшая проверка будет невозможна).
iptables (1 балл)
Настроить следующую дисциплину пакетного фильтра:
-- разрешить все исходящие соединения по всем интерфейсам;
-- разрешить все ICMP пакеты на всех интерфейсах;
-- запретить передачу пакетов с интерфейса на интерфейс;
-- разрешить все входящие соединения на кольцевом (loopback) интерфейсе;
-- запретить все входящие соединения кроме портов: 22/TCP (ssh), 25/TCP (smtp), 80/TCP (http), 110/TCP (pop3), 143/TCP (imap4) и 443/TCP (https) на всех интерфейсах.
dns (1 балл)
Получение сетевых параметров на Вашей виртуальной машине происходит по протоколу dhcp и управляется networkmanager-ом.
Не меняя этого порядка, сконфигурируйте систему так, чтобы используемыми nameserver-ами были 192.168.10.195 и 192.168.10.180, а локальным доменом и доменом для поиска был "olimp".
После этого должны резолвиться в один и тот же ip-адрес, например, имена "server.olimp" и просто "server".
apache
задача1 (1 балл)
Установите apache из репозитория. Программа должна слушать на всех интерфейсах на порту 8000 (вместо 80-го).
задача2 (2 балла)
Сгенерировать самоподписанный сертификат для сайта host###.olimp.
Программа должна слушать на всех интерфейсах на порту 443, используя этот сертификат.
задача3 (1 балл)
Создать (в дополнение к умолчальному) virtualhost(-ы) для сайта host###.olimp с корнем в каталоге /srv/host###/ (каталог должен существовать и быть доступным для чтения пользователю, от имени которого работает apache).
Обращения к этому сайту по протоколу http должны обрабатываться на порту 8000, по протоколу https — на порту 443.
nginx
задача1 (1 балл)
Установите nginx из репозитория. Программа должна слушать на всех интерфейсах на порту 80
задача2 (1 балл)
Программа должна проксировать обращения к сайту host###.olimp на apache, настроенный в предыдущих заданиях.
shell (2 балла)
Написать скрипт /usr/local/bin/script, принимающий на стандартный вход набор строк и выдающий количество строк, полностью совпадающих со строкой (содержащей только буквы и/или цифры), переданной скрипту первым аргументом. Пример его работы:
$ echo -e 'a\nab\nabc' | /usr/local/bin/script a
1
$ echo -e 'a\nab\nabc' | /usr/local/bin/script bc
0
права (3 балла)
Создать пользователей user1, user2, user3 (принадлежность к группам и пароль -- произвольные, остальное -- по умолчанию).
Создать каталоги /share/12, /share/13, /share/23.
Настроить совместную работу с этими каталогами:
-- в каталоге /share/12 пользователи user1 и user2 могут создавать каталоги и файлы, оба пользователя должны получать все права на них, а пользователь user3 -- только права на чтение;
-- в каталоге /share/13 пользователи user1 и user3 могут создавать каталоги и файлы, оба пользователя должны получать все права на них, а пользователь user2 -- только права на чтение;
-- в каталоге /share/23 пользователи user2 и user3 могут создавать каталоги и файлы, оба пользователя должны получать все права на них, а пользователь user1 -- только права на чтение.
Права должны наследоваться создаваемыми файлами и каталогами рекурсивно.
Выражение "все права" подразумевает наличие права и на чтение и на запись.
целостность пакетов (2 балла)
Некоторые файлы некоторых установленных в системе пакетов -- повреждены.
Найдите и исправьте эти повреждения.
задание на внимание и эрудицию (4 балла)
Создать пользователя user4 (пароль -- произвольный, остальное -- по умолчанию).
Не изменяя никаких файлов за пределами домашнего каталога пользвателя user4, добиться того, чтобы команда:
cd; /bin/echo -e "a\nab\nabc" | /bin/grep ab -v
выполненная от имени пользователя user4, возвращала строку "abc" ("нормальное" поведение: выдача строки "a").
Подсказка: для решения задачи достаточно добавить по одной строке нужного содержания всего лишь в два файла внутри домашнего каталога пользователя user4.
По заданию все. На все это выделено 8 часов.
Вот что я успел понарешать.
Предварительное задание (без баллов):
Соединяюсь к серверу:
$ ssh -p 22133 [email protected]
Создаю user.txt:
tester@debian:~$ nano user.txt
# информация обо мне
Конкурсные задания:
ssh
Получаю root:
tester@debian:~$ su -
Добавляю скачанный ключ с https://olimp.site.ru/key:
root@debian:~# nano .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDeYwZCbB...FQZmCkvMmfEMOgwff2/GtrO26B5Ci5KuLNu+v1 imported-openssh-key
Запрещаю логин от root по паролю, только по ключу:
root@debian:~# nano /etc/ssh/sshd_config
PasswordAuthentication yes
PermitRootLogin without-password
root@debian:~# service ssh restart
iptables
Политика IPTables по умолчанию в Debian:
root@debian:~# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Составляю скрипт для удаления всех правил IPTables, чтобы в случае ошибки все правила сбросились и я получил удаленный доступ к серверу:
root@debian:~# nano /etc/restore_iptables.conf
#!/bin/sh
IPT="/sbin/iptables"
# Удаляем все правила
$IPT -F
$IPT -X
# Разрешаем все подключения
$IPT -P INPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT ACCEPT
Делаем скрипт исполняемым и добавляем в cron:
root@debian:~# chmod +x /etc/restore_iptables.conf
root@debian:~# crontab -e
*/5 * * * * /etc/restore_iptables.conf
Создаем наши правила:
-- разрешить все исходящие соединения по всем интерфейсам;
-- разрешить все ICMP пакеты на всех интерфейсах;
-- запретить передачу пакетов с интерфейса на интерфейс;
-- разрешить все входящие соединения на кольцевом (loopback) интерфейсе;
-- запретить все входящие соединения кроме портов: 22/TCP (ssh), 25/TCP (smtp), 80/TCP (http), 110/TCP (pop3), 143/TCP (imap4) и 443/TCP (https) на всех интерфейсах.
root@debian:~# nano /etc/iptables.conf
#!/bin/sh
IPT="/sbin/iptables"
# удаляем все правила
$IPT -F
$IPT -X
# политика все дропать
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP
# разрешить все исходящие соединения по всем интерфейсам
$IPT -A OUTPUT -j ACCEPT
# разрешить все ICMP пакеты на всех интерфейсах
$IPT -A INPUT -p icmp -j ACCEPT
# запретить передачу пакетов с интерфейса на интерфейс
$IPT -A FORWARD -i eth0 -o lo -j DROP
$IPT -A FORWARD -i lo -o eth0 -j DROP
# разрешить все входящие соединения на кольцевом (loopback) интерфейсе
$IPT -A INPUT -i lo -j ACCEPT
# запретить все входящие соединения кроме портов: 22/TCP (ssh), 25/TCP (smtp), 80/TCP (http), 110/TCP (pop3), 143/TCP (imap4) и 443/TCP (https) на всех интерфейсах
# (политика DROP, то есть разрешить INPUT на 22, 25, 80, 110, 143, 443)
$IPT -A INPUT -p TCP --dport 22 -j ACCEPT
$IPT -A INPUT -p TCP --dport 25 -j ACCEPT
$IPT -A INPUT -p TCP --dport 80 -j ACCEPT
$IPT -A INPUT -p TCP --dport 110 -j ACCEPT
$IPT -A INPUT -p TCP --dport 143 -j ACCEPT
$IPT -A INPUT -p TCP --dport 443 -j ACCEPT
$IPT -A INPUT -p TCP --sport 22 -j ACCEPT
$IPT -A INPUT -p TCP --sport 25 -j ACCEPT
$IPT -A INPUT -p TCP --sport 80 -j ACCEPT
$IPT -A INPUT -p TCP --sport 110 -j ACCEPT
$IPT -A INPUT -p TCP --sport 143 -j ACCEPT
$IPT -A INPUT -p TCP --sport 443 -j ACCEPT
# Если этого не сделать, то не работает DNS
$IPT -A INPUT -p UDP --source-port 53 -j ACCEPT
Делаем скрипт исполняемым и запускаем:
root@debian:~# chmod +x /etc/iptables.conf
root@debian:~# /etc/iptables.conf
Проверка:
root@debian:~# iptables -L
Добавляем в автозагрузку:
root@debian:~# nano /etc/network/interfaces
auto lo
iface lo inet loopback
pre-up /etc/iptables.conf
Убираем скрипт очистки правил из cron:
root@debian:~# crontab -e
#*/5 * * * * /etc/restore_iptables.conf
dns
Тут все просто:
root@debian:~# nano /etc/resolv.conf
search olimp
domain olimp
nameserver 192.168.10.195
nameserver 192.168.10.180
Проверяем:
root@debian:~# nslookup server
...
Name: server.olimp
Address: 192.168.10.195
root@debian:~# nslookup server.olimp
...
Name: server.olimp
Address: 192.168.10.195
apache
Установка:
root@debian:~# apt-get install apache2
Проверка корректной работы:
root@debian:~# netstat -tulpan | grep apache
tcp6 0 0 :::80 :::* LISTEN 4694/apache2
root@debian:~# apt-get install curl
root@debian:~# curl -I localhost | head -1
HTTP/1.1 200 OK
Меняем порт на 8000:
root@debian:~# nano /etc/apache2/ports.conf
Listen 8000
Включаем mod_ssl:
root@debian:~# a2enmod ssl
Правим конфиг для дефолтного виртуального хоста:
root@debian:~# nano /etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:8000>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Создаем сертификаты для SSL:
root@debian:~# mkdir /etc/apache2/ssl
root@debian:~# cd /etc/apache2/ssl
root@debian:/etc/apache2/ssl# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt
Создаем виртуальный хост для https:
root@debian:~# nano /etc/apache2/sites-available/default-ssl.conf
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/apache.crt
SSLCertificateKeyFile /etc/apache2/ssl/apache.key
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-6]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
# MSIE 7 and newer should be able to use keepalive
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>
</IfModule>
Включаем виртуальный хост и перезапускаем apache:
root@debian:~# a2ensite default-ssl
root@debian:~# service apache2 restart
Проверка:
root@debian:~# netstat -tulpan | grep apache
tcp6 0 0 :::8000 :::* LISTEN 5292/apache2
tcp6 0 0 :::443 :::* LISTEN 5292/apache2
root@debian:~# curl -I localhost:8000 | head -1
HTTP/1.1 200 OK
root@debian:~# curl https://localhost -kI | head -1
HTTP/1.1 200 OK
Создаю виртуальный хост для host233.olimp:
root@debian:~# nano /etc/apache2/sites-available/host233.olimp.conf
<VirtualHost *:8000>
ServerAdmin webmaster@localhost
DocumentRoot /srv/host233/
ServerName host233.olimp
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory />
Options All
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin webmaster@localhost
ServerName host233.olimp
DocumentRoot /srv/host233/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/apache.crt
SSLCertificateKeyFile /etc/apache2/ssl/apache.key
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-6]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
# MSIE 7 and newer should be able to use keepalive
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
<Directory />
Options All
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
</IfModule>
Создаем директорию для файлов виртуального хоста:
root@debian:~# mkdir /srv/host233
root@debian:~# chmod 755 /srv/host233/
root@debian:~# nano /srv/host233/index.html
TEST!!!
Включаем виртуальный хост, применяем настройки:
root@debian:~# a2ensite host233.olimp
root@debian:~# service apache2 restart
Проверка
root@debian:~# curl host233.olimp:8000
TEST!!!
root@debian:~# curl https://host233.olimp -kI | head -1
HTTP/1.1 200 OK
nginx
Установка:
root@debian:~# apt-get install nginx
Проверка работы:
root@debian:~# netstat -tulpan | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 6864/nginx -g daemo
tcp6 0 0 :::80 :::* LISTEN 6864/nginx -g daemo
Создаем виртуальный хост для host233.olimp:
root@debian:~# nano /etc/nginx/sites-available/host233.olimp
server {
listen 80;
server_name host233.olimp;
access_log /var/log/nginx.access_log;
location / {
proxy_pass http://127.0.0.1:8000/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-for $remote_addr;
proxy_set_header Host $host;
proxy_connect_timeout 60;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_redirect off;
proxy_set_header Connection close;
proxy_pass_header Content-Type;
proxy_pass_header Content-Disposition;
proxy_pass_header Content-Length;
}
}
Включаем хост:
root@debian:~# ln -s /etc/nginx/sites-available/host233.olimp /etc/nginx/sites-enabled/host233.olimp
root@debian:~# service nginx restart
Проверка:
root@debian:~# curl host233.olimp
TEST!!!
shell
Сам скрипт:
root@debian:~# nano /usr/local/bin/script
#!/bin/bash
MTCH=0
while read line; do
TMP=0
TMP=$(echo $line | grep -xc $1)
let MTCH=MTCH+TMP
done
echo $MTCH
Проверка:
root@debian:~# chmod +x /usr/local/bin/script
root@debian:~# echo -e 'a\nab\nabc' | script abc
1
права
Создаем пользователей:
root@debian:~# useradd user1
root@debian:~# useradd user2
root@debian:~# useradd user3
Создаем каталоги и группы:
root@debian:~# mkdir -p /share/{12,13,23}
root@debian:~# groupadd gr12
root@debian:~# groupadd gr13
root@debian:~# groupadd gr23
Распределяем пользователей по группам:
root@debian:~# usermod -a -G gr12 user1
root@debian:~# usermod -a -G gr12 user2
root@debian:~# usermod -a -G gr13 user1
root@debian:~# usermod -a -G gr13 user3
root@debian:~# usermod -a -G gr23 user2
root@debian:~# usermod -a -G gr23 user3
Устанавливаем соответствующие права на каталоги:
root@debian:~# chown user1:gr12 -R /share/12/
root@debian:~# chown user2:gr23 -R /share/23/
root@debian:~# chown user3:gr13 -R /share/13/
root@debian:~# chmod -R 6775 /share/12
root@debian:~# chmod -R 6775 /share/13
root@debian:~# chmod -R 6775 /share/23
Добваляем для пользователей оболочки:
root@debian:~# chsh -s /bin/bash user1
root@debian:~# chsh -s /bin/bash user2
root@debian:~# chsh -s /bin/bash user3
целостность пакетов
Не знаю правильно ли я понял задание, но делал так.
root@debian:~# apt-get install debsums
root@debian:~# debsums --changed
/usr/bin/pdftohtml
/usr/bin/w3mman
Переустанавливаю пакеты, в которых не сходятся контрольные суммы:
root@debian:~# apt-get install --reinstall poppler-utils w3m
Проверка:
root@debian:~# debsums --changed
root@debian:~#
задание на внимание и эрудицию
Тут я долго тупил с алиасами в .bashrc, но так и не додумал, голова кипела.
Я так понял нужно было создать функцию /bin/grep() {} и т.д.
Задания выполнил, сервер после выполнения команды ушел в перезагрузку:
root@debian:~# ssh [email protected]
Конкурсное задание Олимпиады IT-Планета-2015 в номинации Администрирование GNU/Linux выполняется участником на виртуальном сервере, подключенном к сети Интернет. Организаторы предустанавливают дистрибутив Debian GNU/Linux на виртуальных серверах участников в конфигурации по умолчанию, выбор остального используемого ПО (за исключением оговоренного в заданиях) остается целиком на усмотрение участника.
После регистрации каждому участнику высылается его номер и пароль пользователя tester от конкурсного компьютера.
Строкой ### (три «решётки») в дальнейшем обозначается номер участника -- последовательность из 3 цифр, идентифицирующая участника.
По окончании выполнения всех частей задания участник должен оповестить сервер Олимпиады об этом, для чего со своей конкурсной машины необходимо выполнить команду "ssh [email protected]" (пароль: done). Не выполняйте эту команду "просто для проверки"! Если серверу удастся подключиться в ответ к Вашей конкурсной машине, она будет отправлена в перезагрузку. Если перезагрузки не произошло, проверьте, что sshd запущен и слушает 22-й порт, что этот порт не блокируется, и у пользователя root Вашей конкурсной машины верно прописан нужный публичный ключ (см. текст заданий ниже). Результаты проверки будут опубликованы после окончания конкурса.
Оргкомитет и жюри оставляют за собой право связаться с участником по видеосвязи (skype) либо по телефону по своему усмотрению и задать дополнительные вопросы для уточнения подробностей выполнения задания. В случае, если участник не покажет знания подробностей выполненных заданий, он снимается с конкурса.
Если пакеты из репозитория скачиваются слишком медленно, воспользуйтесь более быстрым зеркалом. Например, mirror.yandex.ru.
Доступ к учётной записи root осуществляется с тем же паролем, что и для учётной записи tester.
Предварительное задание (без баллов):
Создать в домашнем каталоге пользователя tester на Вашей конкурсной машине файл user.txt и вписать в него в кодировке UTF-8 пять строк:
Ф.И.О. участника (полностью)
Название учебного заведения (полностью, без сокращений)
Контактный телефон
Контактный e-mail
Номер участника
Конкурсные задания:
ssh (1 балл)
Запретить пользователю root возможность подключаться, используя пароль. ключ следует получить по адресу: https://olimp.site.ru/key (без корректного выполнения этого задания дальнейшая проверка будет невозможна).
iptables (1 балл)
Настроить следующую дисциплину пакетного фильтра:
-- разрешить все исходящие соединения по всем интерфейсам;
-- разрешить все ICMP пакеты на всех интерфейсах;
-- запретить передачу пакетов с интерфейса на интерфейс;
-- разрешить все входящие соединения на кольцевом (loopback) интерфейсе;
-- запретить все входящие соединения кроме портов: 22/TCP (ssh), 25/TCP (smtp), 80/TCP (http), 110/TCP (pop3), 143/TCP (imap4) и 443/TCP (https) на всех интерфейсах.
dns (1 балл)
Получение сетевых параметров на Вашей виртуальной машине происходит по протоколу dhcp и управляется networkmanager-ом.
Не меняя этого порядка, сконфигурируйте систему так, чтобы используемыми nameserver-ами были 192.168.10.195 и 192.168.10.180, а локальным доменом и доменом для поиска был "olimp".
После этого должны резолвиться в один и тот же ip-адрес, например, имена "server.olimp" и просто "server".
apache
задача1 (1 балл)
Установите apache из репозитория. Программа должна слушать на всех интерфейсах на порту 8000 (вместо 80-го).
задача2 (2 балла)
Сгенерировать самоподписанный сертификат для сайта host###.olimp.
Программа должна слушать на всех интерфейсах на порту 443, используя этот сертификат.
задача3 (1 балл)
Создать (в дополнение к умолчальному) virtualhost(-ы) для сайта host###.olimp с корнем в каталоге /srv/host###/ (каталог должен существовать и быть доступным для чтения пользователю, от имени которого работает apache).
Обращения к этому сайту по протоколу http должны обрабатываться на порту 8000, по протоколу https — на порту 443.
nginx
задача1 (1 балл)
Установите nginx из репозитория. Программа должна слушать на всех интерфейсах на порту 80
задача2 (1 балл)
Программа должна проксировать обращения к сайту host###.olimp на apache, настроенный в предыдущих заданиях.
shell (2 балла)
Написать скрипт /usr/local/bin/script, принимающий на стандартный вход набор строк и выдающий количество строк, полностью совпадающих со строкой (содержащей только буквы и/или цифры), переданной скрипту первым аргументом. Пример его работы:
$ echo -e 'a\nab\nabc' | /usr/local/bin/script a
1
$ echo -e 'a\nab\nabc' | /usr/local/bin/script bc
0
права (3 балла)
Создать пользователей user1, user2, user3 (принадлежность к группам и пароль -- произвольные, остальное -- по умолчанию).
Создать каталоги /share/12, /share/13, /share/23.
Настроить совместную работу с этими каталогами:
-- в каталоге /share/12 пользователи user1 и user2 могут создавать каталоги и файлы, оба пользователя должны получать все права на них, а пользователь user3 -- только права на чтение;
-- в каталоге /share/13 пользователи user1 и user3 могут создавать каталоги и файлы, оба пользователя должны получать все права на них, а пользователь user2 -- только права на чтение;
-- в каталоге /share/23 пользователи user2 и user3 могут создавать каталоги и файлы, оба пользователя должны получать все права на них, а пользователь user1 -- только права на чтение.
Права должны наследоваться создаваемыми файлами и каталогами рекурсивно.
Выражение "все права" подразумевает наличие права и на чтение и на запись.
целостность пакетов (2 балла)
Некоторые файлы некоторых установленных в системе пакетов -- повреждены.
Найдите и исправьте эти повреждения.
задание на внимание и эрудицию (4 балла)
Создать пользователя user4 (пароль -- произвольный, остальное -- по умолчанию).
Не изменяя никаких файлов за пределами домашнего каталога пользвателя user4, добиться того, чтобы команда:
cd; /bin/echo -e "a\nab\nabc" | /bin/grep ab -v
выполненная от имени пользователя user4, возвращала строку "abc" ("нормальное" поведение: выдача строки "a").
Подсказка: для решения задачи достаточно добавить по одной строке нужного содержания всего лишь в два файла внутри домашнего каталога пользователя user4.
По заданию все. На все это выделено 8 часов.
Вот что я успел понарешать.
Предварительное задание (без баллов):
Соединяюсь к серверу:
$ ssh -p 22133 [email protected]
Создаю user.txt:
tester@debian:~$ nano user.txt
# информация обо мне
Конкурсные задания:
ssh
Получаю root:
tester@debian:~$ su -
Добавляю скачанный ключ с https://olimp.site.ru/key:
root@debian:~# nano .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDeYwZCbB...FQZmCkvMmfEMOgwff2/GtrO26B5Ci5KuLNu+v1 imported-openssh-key
Запрещаю логин от root по паролю, только по ключу:
root@debian:~# nano /etc/ssh/sshd_config
PasswordAuthentication yes
PermitRootLogin without-password
root@debian:~# service ssh restart
iptables
Политика IPTables по умолчанию в Debian:
root@debian:~# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Составляю скрипт для удаления всех правил IPTables, чтобы в случае ошибки все правила сбросились и я получил удаленный доступ к серверу:
root@debian:~# nano /etc/restore_iptables.conf
#!/bin/sh
IPT="/sbin/iptables"
# Удаляем все правила
$IPT -F
$IPT -X
# Разрешаем все подключения
$IPT -P INPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT ACCEPT
Делаем скрипт исполняемым и добавляем в cron:
root@debian:~# chmod +x /etc/restore_iptables.conf
root@debian:~# crontab -e
*/5 * * * * /etc/restore_iptables.conf
Создаем наши правила:
-- разрешить все исходящие соединения по всем интерфейсам;
-- разрешить все ICMP пакеты на всех интерфейсах;
-- запретить передачу пакетов с интерфейса на интерфейс;
-- разрешить все входящие соединения на кольцевом (loopback) интерфейсе;
-- запретить все входящие соединения кроме портов: 22/TCP (ssh), 25/TCP (smtp), 80/TCP (http), 110/TCP (pop3), 143/TCP (imap4) и 443/TCP (https) на всех интерфейсах.
root@debian:~# nano /etc/iptables.conf
#!/bin/sh
IPT="/sbin/iptables"
# удаляем все правила
$IPT -F
$IPT -X
# политика все дропать
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP
# разрешить все исходящие соединения по всем интерфейсам
$IPT -A OUTPUT -j ACCEPT
# разрешить все ICMP пакеты на всех интерфейсах
$IPT -A INPUT -p icmp -j ACCEPT
# запретить передачу пакетов с интерфейса на интерфейс
$IPT -A FORWARD -i eth0 -o lo -j DROP
$IPT -A FORWARD -i lo -o eth0 -j DROP
# разрешить все входящие соединения на кольцевом (loopback) интерфейсе
$IPT -A INPUT -i lo -j ACCEPT
# запретить все входящие соединения кроме портов: 22/TCP (ssh), 25/TCP (smtp), 80/TCP (http), 110/TCP (pop3), 143/TCP (imap4) и 443/TCP (https) на всех интерфейсах
# (политика DROP, то есть разрешить INPUT на 22, 25, 80, 110, 143, 443)
$IPT -A INPUT -p TCP --dport 22 -j ACCEPT
$IPT -A INPUT -p TCP --dport 25 -j ACCEPT
$IPT -A INPUT -p TCP --dport 80 -j ACCEPT
$IPT -A INPUT -p TCP --dport 110 -j ACCEPT
$IPT -A INPUT -p TCP --dport 143 -j ACCEPT
$IPT -A INPUT -p TCP --dport 443 -j ACCEPT
$IPT -A INPUT -p TCP --sport 22 -j ACCEPT
$IPT -A INPUT -p TCP --sport 25 -j ACCEPT
$IPT -A INPUT -p TCP --sport 80 -j ACCEPT
$IPT -A INPUT -p TCP --sport 110 -j ACCEPT
$IPT -A INPUT -p TCP --sport 143 -j ACCEPT
$IPT -A INPUT -p TCP --sport 443 -j ACCEPT
# Если этого не сделать, то не работает DNS
$IPT -A INPUT -p UDP --source-port 53 -j ACCEPT
Делаем скрипт исполняемым и запускаем:
root@debian:~# chmod +x /etc/iptables.conf
root@debian:~# /etc/iptables.conf
Проверка:
root@debian:~# iptables -L
Добавляем в автозагрузку:
root@debian:~# nano /etc/network/interfaces
auto lo
iface lo inet loopback
pre-up /etc/iptables.conf
Убираем скрипт очистки правил из cron:
root@debian:~# crontab -e
#*/5 * * * * /etc/restore_iptables.conf
dns
Тут все просто:
root@debian:~# nano /etc/resolv.conf
search olimp
domain olimp
nameserver 192.168.10.195
nameserver 192.168.10.180
Проверяем:
root@debian:~# nslookup server
...
Name: server.olimp
Address: 192.168.10.195
root@debian:~# nslookup server.olimp
...
Name: server.olimp
Address: 192.168.10.195
apache
Установка:
root@debian:~# apt-get install apache2
Проверка корректной работы:
root@debian:~# netstat -tulpan | grep apache
tcp6 0 0 :::80 :::* LISTEN 4694/apache2
root@debian:~# apt-get install curl
root@debian:~# curl -I localhost | head -1
HTTP/1.1 200 OK
Меняем порт на 8000:
root@debian:~# nano /etc/apache2/ports.conf
Listen 8000
Включаем mod_ssl:
root@debian:~# a2enmod ssl
Правим конфиг для дефолтного виртуального хоста:
root@debian:~# nano /etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:8000>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Создаем сертификаты для SSL:
root@debian:~# mkdir /etc/apache2/ssl
root@debian:~# cd /etc/apache2/ssl
root@debian:/etc/apache2/ssl# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt
Создаем виртуальный хост для https:
root@debian:~# nano /etc/apache2/sites-available/default-ssl.conf
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/apache.crt
SSLCertificateKeyFile /etc/apache2/ssl/apache.key
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-6]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
# MSIE 7 and newer should be able to use keepalive
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>
</IfModule>
Включаем виртуальный хост и перезапускаем apache:
root@debian:~# a2ensite default-ssl
root@debian:~# service apache2 restart
Проверка:
root@debian:~# netstat -tulpan | grep apache
tcp6 0 0 :::8000 :::* LISTEN 5292/apache2
tcp6 0 0 :::443 :::* LISTEN 5292/apache2
root@debian:~# curl -I localhost:8000 | head -1
HTTP/1.1 200 OK
root@debian:~# curl https://localhost -kI | head -1
HTTP/1.1 200 OK
Создаю виртуальный хост для host233.olimp:
root@debian:~# nano /etc/apache2/sites-available/host233.olimp.conf
<VirtualHost *:8000>
ServerAdmin webmaster@localhost
DocumentRoot /srv/host233/
ServerName host233.olimp
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory />
Options All
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin webmaster@localhost
ServerName host233.olimp
DocumentRoot /srv/host233/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/apache.crt
SSLCertificateKeyFile /etc/apache2/ssl/apache.key
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-6]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
# MSIE 7 and newer should be able to use keepalive
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
<Directory />
Options All
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
</IfModule>
Создаем директорию для файлов виртуального хоста:
root@debian:~# mkdir /srv/host233
root@debian:~# chmod 755 /srv/host233/
root@debian:~# nano /srv/host233/index.html
TEST!!!
Включаем виртуальный хост, применяем настройки:
root@debian:~# a2ensite host233.olimp
root@debian:~# service apache2 restart
Проверка
root@debian:~# curl host233.olimp:8000
TEST!!!
root@debian:~# curl https://host233.olimp -kI | head -1
HTTP/1.1 200 OK
nginx
Установка:
root@debian:~# apt-get install nginx
Проверка работы:
root@debian:~# netstat -tulpan | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 6864/nginx -g daemo
tcp6 0 0 :::80 :::* LISTEN 6864/nginx -g daemo
Создаем виртуальный хост для host233.olimp:
root@debian:~# nano /etc/nginx/sites-available/host233.olimp
server {
listen 80;
server_name host233.olimp;
access_log /var/log/nginx.access_log;
location / {
proxy_pass http://127.0.0.1:8000/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-for $remote_addr;
proxy_set_header Host $host;
proxy_connect_timeout 60;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_redirect off;
proxy_set_header Connection close;
proxy_pass_header Content-Type;
proxy_pass_header Content-Disposition;
proxy_pass_header Content-Length;
}
}
Включаем хост:
root@debian:~# ln -s /etc/nginx/sites-available/host233.olimp /etc/nginx/sites-enabled/host233.olimp
root@debian:~# service nginx restart
Проверка:
root@debian:~# curl host233.olimp
TEST!!!
shell
Сам скрипт:
root@debian:~# nano /usr/local/bin/script
#!/bin/bash
MTCH=0
while read line; do
TMP=0
TMP=$(echo $line | grep -xc $1)
let MTCH=MTCH+TMP
done
echo $MTCH
Проверка:
root@debian:~# chmod +x /usr/local/bin/script
root@debian:~# echo -e 'a\nab\nabc' | script abc
1
права
Создаем пользователей:
root@debian:~# useradd user1
root@debian:~# useradd user2
root@debian:~# useradd user3
Создаем каталоги и группы:
root@debian:~# mkdir -p /share/{12,13,23}
root@debian:~# groupadd gr12
root@debian:~# groupadd gr13
root@debian:~# groupadd gr23
Распределяем пользователей по группам:
root@debian:~# usermod -a -G gr12 user1
root@debian:~# usermod -a -G gr12 user2
root@debian:~# usermod -a -G gr13 user1
root@debian:~# usermod -a -G gr13 user3
root@debian:~# usermod -a -G gr23 user2
root@debian:~# usermod -a -G gr23 user3
Устанавливаем соответствующие права на каталоги:
root@debian:~# chown user1:gr12 -R /share/12/
root@debian:~# chown user2:gr23 -R /share/23/
root@debian:~# chown user3:gr13 -R /share/13/
root@debian:~# chmod -R 6775 /share/12
root@debian:~# chmod -R 6775 /share/13
root@debian:~# chmod -R 6775 /share/23
Добваляем для пользователей оболочки:
root@debian:~# chsh -s /bin/bash user1
root@debian:~# chsh -s /bin/bash user2
root@debian:~# chsh -s /bin/bash user3
целостность пакетов
Не знаю правильно ли я понял задание, но делал так.
root@debian:~# apt-get install debsums
root@debian:~# debsums --changed
/usr/bin/pdftohtml
/usr/bin/w3mman
Переустанавливаю пакеты, в которых не сходятся контрольные суммы:
root@debian:~# apt-get install --reinstall poppler-utils w3m
Проверка:
root@debian:~# debsums --changed
root@debian:~#
задание на внимание и эрудицию
Тут я долго тупил с алиасами в .bashrc, но так и не додумал, голова кипела.
Я так понял нужно было создать функцию /bin/grep() {} и т.д.
Задания выполнил, сервер после выполнения команды ушел в перезагрузку:
root@debian:~# ssh [email protected]
1 комментарий:
В настройке прав доступа нужно создать домашние каталоги пользователей, а затем добавить оболочку пользоватей, иначе вылетит ошибочка
No directory, logging in with HOME=/
строчечку изменил на
#проверка
echo "Для папки /share/12/"
su -l -c 'touch /share/12/user1' user1;
su -l -c 'touch /share/12/user2' user2;
su -l -c 'touch /share/12/user3' user3;
echo "Для папки /share/13/"
su -l -c 'touch /share/13/user1' user1;
su -l -c 'touch /share/13/user2' user2;
su -l -c 'touch /share/13/user3' user3;
echo "Для папки /share/23/"
su -l -c 'touch /share/23/user1' user1;
su -l -c 'touch /share/23/user2' user2;
su -l -c 'touch /share/23/user3' user3;
добавлял пользователей и оболочку но не создал домашние каталоги пользователей))) и от сюда брет в выводе
root@ubuntu:~# useradd user1
root@ubuntu:~# useradd user2
root@ubuntu:~# useradd user3
root@ubuntu:~# chsh -s /bin/bash user1
root@ubuntu:~# chsh -s /bin/bash user2
root@ubuntu:~# chsh -s /bin/bash user3
root@ubuntu:~# echo "Для папки /share/12/"
Для папки /share/12/
root@ubuntu:~# su -l -c 'touch /share/12/user1' user1;
No directory, logging in with HOME=/
root@ubuntu:~# su -l -c 'touch /share/12/user2' user2;
No directory, logging in with HOME=/
root@ubuntu:~# su -l -c 'touch /share/12/user3' user3;
No directory, logging in with HOME=/
touch: невозможно выполнить touch для «/share/12/user3»: Отказано в доступе
root@ubuntu:~# echo "Для папки /share/13/"
Для папки /share/13/
root@ubuntu:~# su -l -c 'touch /share/13/user1' user1;
No directory, logging in with HOME=/
root@ubuntu:~# su -l -c 'touch /share/13/user2' user2;
No directory, logging in with HOME=/
touch: невозможно выполнить touch для «/share/13/user2»: Отказано в доступе
root@ubuntu:~# su -l -c 'touch /share/13/user3' user3;
No directory, logging in with HOME=/
root@ubuntu:~# echo "Для папки /share/23/"
Для папки /share/23/
root@ubuntu:~# su -l -c 'touch /share/23/user1' user1;
No directory, logging in with HOME=/
touch: невозможно выполнить touch для «/share/23/user1»: Отказано в доступе
root@ubuntu:~# su -l -c 'touch /share/23/user2' user2;
No directory, logging in with HOME=/
root@ubuntu:~# su -l -c 'touch /share/23/user3' user3;
No directory, logging in with HOME=/
но стоит сделать вот так все норм)))
вообщем добавить командочку
mkdir -p /home/{user1,user2,user13}
#проверка
echo "Для папки /share/12/"
su -l -c 'touch /share/12/user1' user1;
su -l -c 'touch /share/12/user2' user2;
su -l -c 'touch /share/12/user3' user3;
echo "Для папки /share/13/"
su -l -c 'touch /share/13/user1' user1;
su -l -c 'touch /share/13/user2' user2;
su -l -c 'touch /share/13/user3' user3;
echo "Для папки /share/23/"
su -l -c 'touch /share/23/user1' user1;
su -l -c 'touch /share/23/user2' user2;
su -l -c 'touch /share/23/user3' user3;
root@ubuntu:~# ls /share/12/
user1 user2
root@ubuntu:~# ls /share/13/
user1 user3
root@ubuntu:~# ls /share/23/
user2 user3
Отправить комментарий