вторник, 17 марта 2015 г.

Олимпиада по администрированию Linux (16.03.2015)

Предварительная информация:
Конкурсное задание Олимпиады 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