вторник, 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 часов.
Вот что я успел понарешать.

Предварительное задание (без баллов):
Соединяюсь к серверу:
[email protected] ~ $ ssh -p 22133 [email protected]
Создаю user.txt:
[email protected]:~$ nano user.txt
# информация обо мне

Конкурсные задания:
ssh
Получаю root:
[email protected]:~$ su -
Добавляю скачанный ключ с https://olimp.site.ru/key:
[email protected]:~# nano .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDeYwZCbB...FQZmCkvMmfEMOgwff2/GtrO26B5Ci5KuLNu+v1 imported-openssh-key

Запрещаю логин от root по паролю, только по ключу:
[email protected]:~# nano /etc/ssh/sshd_config
PasswordAuthentication yes
PermitRootLogin without-password

[email protected]:~# service ssh restart


iptables
Политика IPTables по умолчанию в Debian:
[email protected]:~# 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, чтобы в случае ошибки все правила сбросились и я получил удаленный доступ к серверу:
[email protected]:~# 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:
[email protected]:~# chmod +x /etc/restore_iptables.conf
[email protected]:~# 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) на всех интерфейсах.

[email protected]:~# 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

Делаем скрипт исполняемым и запускаем:
[email protected]:~# chmod +x /etc/iptables.conf
[email protected]:~# /etc/iptables.conf

Проверка:
[email protected]:~# iptables -L   

Добавляем в автозагрузку:
[email protected]:~# nano /etc/network/interfaces
auto lo
iface lo inet loopback
        pre-up /etc/iptables.conf
     
Убираем скрипт очистки правил из cron:
[email protected]:~# crontab -e
#*/5 * * * * /etc/restore_iptables.conf


dns
Тут все просто:
[email protected]:~# nano /etc/resolv.conf
search olimp
domain olimp
nameserver 192.168.10.195
nameserver 192.168.10.180

Проверяем:
[email protected]:~# nslookup server
...
Name: server.olimp
Address: 192.168.10.195

[email protected]:~# nslookup server.olimp
...
Name: server.olimp
Address: 192.168.10.195


apache
Установка:
[email protected]:~# apt-get install apache2

Проверка корректной работы:
[email protected]:~# netstat -tulpan | grep apache
tcp6   0   0 :::80   :::*   LISTEN   4694/apache2

[email protected]:~# apt-get install curl
[email protected]:~# curl -I localhost | head -1
HTTP/1.1 200 OK

Меняем порт на 8000:
[email protected]:~# nano /etc/apache2/ports.conf
Listen 8000

Включаем mod_ssl:
[email protected]:~# a2enmod ssl

Правим конфиг для дефолтного виртуального хоста:
[email protected]:~# nano /etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:8000>
   ServerAdmin [email protected]
   DocumentRoot /var/www/html
   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Создаем сертификаты для SSL:
[email protected]:~# mkdir /etc/apache2/ssl
[email protected]:~# cd /etc/apache2/ssl
[email protected]:/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:
[email protected]:~# nano /etc/apache2/sites-available/default-ssl.conf
<IfModule mod_ssl.c>
   <VirtualHost _default_:443>
      ServerAdmin [email protected]
      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:
[email protected]:~# a2ensite default-ssl
[email protected]:~# service apache2 restart

Проверка:
[email protected]:~# netstat -tulpan | grep apache
tcp6   0   0 :::8000   :::*   LISTEN   5292/apache2    
tcp6   0   0 :::443   :::*   LISTEN   5292/apache2

[email protected]:~# curl -I localhost:8000 | head -1
HTTP/1.1 200 OK
[email protected]:~# curl https://localhost -kI | head -1
HTTP/1.1 200 OK

Создаю виртуальный хост для host233.olimp:
[email protected]:~# nano /etc/apache2/sites-available/host233.olimp.conf
<VirtualHost *:8000>
   ServerAdmin [email protected]
   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 [email protected]
      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>

Создаем директорию для файлов виртуального хоста:
[email protected]:~# mkdir /srv/host233
[email protected]:~# chmod 755 /srv/host233/
[email protected]:~# nano /srv/host233/index.html
TEST!!!

Включаем виртуальный хост, применяем настройки:
[email protected]:~# a2ensite host233.olimp
[email protected]:~# service apache2 restart

Проверка
[email protected]:~# curl host233.olimp:8000
TEST!!!
[email protected]:~# curl https://host233.olimp -kI | head -1
HTTP/1.1 200 OK

nginx
Установка:
[email protected]:~# apt-get install nginx

Проверка работы:
[email protected]:~# 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:
[email protected]:~# 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;
   }


Включаем хост:
[email protected]:~# ln -s /etc/nginx/sites-available/host233.olimp /etc/nginx/sites-enabled/host233.olimp
[email protected]:~# service nginx restart

Проверка:
[email protected]:~# curl host233.olimp
TEST!!!


shell
Сам скрипт:
[email protected]:~# 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

Проверка:
[email protected]:~# chmod +x /usr/local/bin/script
[email protected]:~# echo -e 'a\nab\nabc' | script abc
1


права
Создаем пользователей:
[email protected]:~# useradd user1
[email protected]:~# useradd user2
[email protected]:~# useradd user3

Создаем каталоги и группы:
[email protected]:~# mkdir -p /share/{12,13,23}
[email protected]:~# groupadd gr12
[email protected]:~# groupadd gr13
[email protected]:~# groupadd gr23

Распределяем пользователей по группам:
[email protected]:~# usermod -a -G gr12 user1
[email protected]:~# usermod -a -G gr12 user2
[email protected]:~# usermod -a -G gr13 user1
[email protected]:~# usermod -a -G gr13 user3
[email protected]:~# usermod -a -G gr23 user2
[email protected]:~# usermod -a -G gr23 user3

Устанавливаем соответствующие права на каталоги:
[email protected]:~# chown user1:gr12 -R /share/12/
[email protected]:~# chown user2:gr23 -R /share/23/
[email protected]:~# chown user3:gr13 -R /share/13/
[email protected]:~# chmod -R 6775 /share/12
[email protected]:~# chmod -R 6775 /share/13
[email protected]:~# chmod -R 6775 /share/23

Добваляем для пользователей оболочки:
[email protected]:~# chsh -s /bin/bash user1
[email protected]:~# chsh -s /bin/bash user2
[email protected]:~# chsh -s /bin/bash user3


целостность пакетов
Не знаю правильно ли я понял задание, но делал так.
[email protected]:~# apt-get install debsums
[email protected]:~# debsums --changed
/usr/bin/pdftohtml
/usr/bin/w3mman

Переустанавливаю пакеты, в которых не сходятся контрольные суммы:
[email protected]:~# apt-get install --reinstall poppler-utils w3m

Проверка:
[email protected]:~# debsums --changed
[email protected]:~#

задание на внимание и эрудицию
Тут я долго тупил с алиасами в .bashrc, но так и не додумал, голова кипела.
Я так понял нужно было создать функцию /bin/grep() {}  и т.д.

Задания выполнил, сервер после выполнения команды ушел в перезагрузку:
[email protected]:~# 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;
добавлял пользователей и оболочку но не создал домашние каталоги пользователей))) и от сюда брет в выводе
[email protected]:~# useradd user1
[email protected]:~# useradd user2
[email protected]:~# useradd user3
[email protected]:~# chsh -s /bin/bash user1
[email protected]:~# chsh -s /bin/bash user2
[email protected]:~# chsh -s /bin/bash user3
[email protected]:~# echo "Для папки /share/12/"
Для папки /share/12/
[email protected]:~# su -l -c 'touch /share/12/user1' user1;
No directory, logging in with HOME=/
[email protected]:~# su -l -c 'touch /share/12/user2' user2;
No directory, logging in with HOME=/
[email protected]:~# su -l -c 'touch /share/12/user3' user3;
No directory, logging in with HOME=/
touch: невозможно выполнить touch для «/share/12/user3»: Отказано в доступе
[email protected]:~# echo "Для папки /share/13/"
Для папки /share/13/
[email protected]:~# su -l -c 'touch /share/13/user1' user1;
No directory, logging in with HOME=/
[email protected]:~# su -l -c 'touch /share/13/user2' user2;
No directory, logging in with HOME=/
touch: невозможно выполнить touch для «/share/13/user2»: Отказано в доступе
[email protected]:~# su -l -c 'touch /share/13/user3' user3;
No directory, logging in with HOME=/
[email protected]:~# echo "Для папки /share/23/"
Для папки /share/23/
[email protected]:~# su -l -c 'touch /share/23/user1' user1;
No directory, logging in with HOME=/
touch: невозможно выполнить touch для «/share/23/user1»: Отказано в доступе
[email protected]:~# su -l -c 'touch /share/23/user2' user2;
No directory, logging in with HOME=/
[email protected]:~# 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;
[email protected]:~# ls /share/12/
user1 user2
[email protected]:~# ls /share/13/
user1 user3
[email protected]:~# ls /share/23/
user2 user3