reorganize homeworks structure for parts 1-3

This commit is contained in:
2022-04-06 10:22:40 +07:00
parent e8c9ed8597
commit 2f7fd3bee7
30 changed files with 156 additions and 160 deletions

View File

@@ -0,0 +1,7 @@
#!/bin/bash
[[ -d /tmp ]]
echo $?
[[ -d /tmp/some-dir ]]
echo $?

View File

@@ -0,0 +1,70 @@
Выполнение [домашнего задания](https://github.com/netology-code/sysadm-homeworks/blob/devsys10/03-sysadmin-01-terminal/README.md)
по теме "Работа в терминале, лекция 1".
## Q/A
1. Какие ресурсы выделены для виртуальной машины по умолчанию?
```
RAM: 1024 MB
CPU: 2
VRAM: 4 MB
HDD: 64GB
```
2. Как добавить оперативной памяти или ресурсов процессора виртуальной машине?
В конфигурацию `Vargrantfile` необходимо добавить следующие строки:
```
config.vm.provider "virtualbox" do |v|
v.memory = 2048
v.cpus = 4
end
```
3. `man bash`
1. какой переменной можно задать длину журнала history, и на какой строчке manual это описывается?
При помощи проставления переменной `HISTSIZE`. Описание находится на 591 строке мануала.
Показать строки возможно при помощи указания кастомного пейджера для команды `man`:
```shell
man --pager="less -N" bash
```
2. что делает директива `ignoreboth` в bash?
Значение `ignoreboth` проставляется для переменной `HISTCONTROL` и является сокращением для значений `ignorespace` и `ignoredups`.
Конкретно это означает, что команды, которые начинаются с пробела или совпадают с предыдущей записью в истории, не попадут в файл истории `bash`.
3. В каких сценариях использования применимы скобки `{}` и на какой строчке man bash это описано?
Фигурные скобки используются при написании сложных команд (`Compound Commands`). Про это написано на 196 строке мануала.
4. Как создать однократным вызовом touch 100000 файлов? Получится ли аналогичным образом создать 300000? Если нет, то почему?
Создать множество файлов можно написанием сложной команды `touch {1..100000}`. Создать более `ARG_MAX` файлов в рамках одного запуска не получится.
На текущей версии linux данная переменная равна 2097152.
5. Что делает конструкция `[[ -d /tmp ]]`
Возвращает 0, если `/tmp` существует и это директория, или 1, в ином случае.
Скрипт, проверяющий данный ответ находится в файле [double_square_braket.sh](double_square_braket.sh).
4. Добейтесь в выводе type -a bash в виртуальной машине наличия первым пунктом в списке.
Подобного можно добиться, сделав три шага:
* Создать новую директорию `mkdir /tmp/new_path_directory`
* Сделать символическую ссылку для баша `ln -s /usr/bin/bash /tmp/new_path_directory/bash`
* Изменив переменную окружения `PATH` с помощью `export PATH=/tmp/new_path_directory:${PATH}`
Таким образом вывод команды будет таким, как в задаче:
```shell
type -a bash
bash is /tmp/new_path_directory/bash
bash is /usr/bin/bash
bash is /bin/bash
```
5. Чем отличается планирование команд с помощью `batch` и `at`?
Ничем, это одна и та же команда.

View File

@@ -0,0 +1,111 @@
Выполнение [домашнего задания](https://github.com/netology-code/sysadm-homeworks/blob/devsys10/03-sysadmin-02-terminal/README.md)
по теме "Работа в терминале, лекция 2".
## Q/A
1. Какого типа команда `cd`?
При вызове `type cd` будет выведено, что `cd is a shell builtin`, то есть команда встроенная в оболочку.
Данная команда необходима для работы пользователя с терминалом и для работы других команд, именно поэтому она встроена в ядро операционной системы.
2. Какая альтернатива без pipe команде `grep <some_string> <some_file> | wc -l`?
Альтернативой является команда `grep -c <some_string> <some_file>`.
3. Какой процесс с PID 1 является родителем для всех процессов в вашей виртуальной машине Ubuntu 20.04?
Найти родителя всех процессов можно вызвав команду `pstree -p | grep \(1\)`.
Ответ: процесс с PID 1 - `systemd`.
4. Как будет выглядеть команда, которая перенаправит вывод stderr `ls` на другую сессию терминала?
Откроем два терминала на виртуальной машине. Для каждого из них будет создан новый файл в директории `/dev/pts/`.
Таким образом, если мы хотим перенаправить stderr команды, то нужно выполнить следующие действия:
перенаправить вывод stderr в stdout, затем перенаправить stdout в `/dev/pts/<n>`, где <n> - целое число, идентификатор сессии терминала.
Полный пример команды:
```shell
ls /some/invalid/dir 2>&1 1>&/dev/pts/<n>
```
5. Получится ли одновременно передать команде файл на stdin и вывести ее stdout в другой файл?
Да, подобное можно реализовать следующим способом.
```shell
touch in_file
echo "abc" > in_file
echo "bcd" >> in_file
grep abc < in_file 1>&out_file
cat out_file
```
Содержимое out_file является выводом команды grep, а именно одна строка `abc`.
6. Получится ли находясь в графическом режиме, вывести данные из PTY в какой-либо из эмуляторов TTY? Сможете ли вы наблюдать выводимые данные?
Да, подобное возможно. Достаточно, например, открыть новую сессию терминала в графической оболочке и выполнить перенаправление потока в `/dev/pts/<n>`.
Так же любая программа с графическим интерфейсом может выполнить данное действие. Наблюдать данные возможно,
если открыт терминал, подключённый к конкретной сессии.
7. Выполните команду `bash 5>&1`. К чему она приведет? Что будет, если вы выполните `echo netology > /proc/$$/fd/5`? Почему так происходит?
Насколько я понимаю, команда `bash 5>&1` создаёт новую терминальную сессию с перенаправлением потока из `5` в `1`, то есть в `stdout`.
Но так как `5` - это не стандартный идентификатор потока, поэтому оболочка создаст новый файл `/proc/$$/fd/5`.
Данный файл будет алиасом для stdout, поэтому выполнение `echo` выведет содержимое в терминал,
как это сделал бы обычный вызов команды без перенаправлений потока.
8. Получится ли в качестве входного потока для pipe использовать только stderr команды, не потеряв при этом отображение stdout на pty?
Да, такая возможность есть. Сначала необходимо запустить терминал с новым перенаправлением, как в предыдущем вопросе: `bash 5>&1`.
Затем уже можно выполнить перенаправление потоков следующим образом:
```shell
ls -la /tmp/wrong_dir 2>&1 1>&5 | less
```
Таким образом в команду `less` попадёт следующий текст: `ls: cannot access '/tmp/wrong_dir': No such file or directory`.
9. Что выведет команда `cat /proc/$$/environ`? Как еще можно получить аналогичный по содержанию вывод?
Данная команда выведет все переменные окружения, которые инициализированы в текущей сессии терминала.
Аналогичный результат может быть достигнут вызовом команд `printenv` или `env`.
10. Используя `man`, опишите что доступно по адресам `/proc/<PID>/cmdline`, `/proc/<PID>/exe`.
Файл `/proc/<PID>/cmdline` - это файл, предназначенный только для чтения, который содержит в себе полную команду процесса, но только если процесс не зомби.
Файл `/proc/<PID>/exe` - это файл-символическая ссылка, содержащая актуальный полный путь до выполняемой команды.
11. Узнайте, какую наиболее старшую версию набора инструкций SSE поддерживает ваш процессор с помощью `/proc/cpuinfo`
Выполним команду `cat /proc/cpuinfo | grep sse`. В выводе можно найти такие версии, как `sse`, `sse2`, `ssse3`, `sse4_1`, `sse4_2`.
Таким образом, ответом на вопрос будет `sse4_2`.
12. Почему команда `ssh localhost 'tty'` внутри виртуальной машины выдаёт ошибку `not a tty`
Изначально, нужно понять, что происходит при выполнении исходной команды. Судя по мануалу команды `ssh`,
`localhost` является пунктом назначения, куда будет произведено подключение,
а `tty` - это команда, которая будет выполнена на удалённом сервере. Из того же мануала следует,
что при указании команды будет произведено выполнение команды, а не логин пользователя. То есть,
команда будет выполнена без выделения отдельной сессии для пользователя,
а значит команда `tty` в данном случае действительно не сможет найти запущенный экземпляр терминала.
Изменить поведение можно принудительно заставив `ssh` создать новую сессию, для этого нужно добавить ключ `-t`,
то есть выполнить команду `ssh -t localhost 'tty'`.
13. Необходимо переместить запущенный процесс из одной сессии в другую с использованием утилиты `reptyr`
На виртуальной машине утилита не установлена, поэтому установим её `sudo apt install reptyr`.
В качестве примера запустим утилиту `screen`, которая запустит новую сессию внутри себя.
В другом подключении через ssh к виртуальной машине запустим "долгий" процесс, например, `less .bash_history`.
Внутри сессии `screen` найдём PID процесса `less`, для этого выполним команду `lsof | grep less`.
Затем выполним команду `reptyr <PID>`.
К сожалению, полностью перенести процесс не получилось, есть какие-то странные ошибки по типу `Operation not permitted`
или "зависания" второго терминала, если выполнить команду от администратора.
14. Узнайте что делает команда `tee` и почему в отличие от `sudo echo` команда с `sudo tee` будет работать.
Команда `tee` читает стандартный поток ввода и пишет его в стандартный поток вывода и файлы.
В отличие от `echo` перенаправление идёт в рамках одного процесса, именно поэтому `sudo tee` будет работать,
так как процесс берёт стандартный поток ввода от текущего пользователя, затем начинает запись с повышенными привилегиями.

View File

@@ -0,0 +1,122 @@
Выполнение [домашнего задания](https://github.com/netology-code/sysadm-homeworks/blob/devsys10/03-sysadmin-03-os/README.md)
по теме "3.3. Операционные системы, лекция 1".
## Q/A
1. Какой системный вызов делает команда `cd`?
Для удобства поиска перенаправим вывод команды `strace` в утилиту `less`
```shell
strace /bin/bash -c 'cd /tmp' 2>&1 | less
```
Далее, найдём в трейсе упоминание директории `tmp`, указанной в команде. Таким образом, обнаружим, что команда `cd`
делает системный вызов `chdir("/tmp")`.
2. Используя `strace` выясните, где находится база данных `file` на основании которой она делает свои догадки.
При использовании команды `file` на любом файле, `strace` выведет такую строку:
```
openat(AT_FDCWD, "/usr/share/misc/magic.mgc", O_RDONLY) = 3
```
Предположительно, `/usr/share/misc/magic.mgc` - это и есть база данных для команды `file`.
3. Предложите способ обнуления открытого удаленного файла (чтобы освободить место на файловой системе)
Зная PID процесса и то, что каждый процесс пишет свои потоки в файлы в директории `/proc/<PID>/fd`.
Таким образом, можно найти конкретный поток, который пишет в файл, вызвав команду
```shell
ls -la /proc/1988/fd/
total 0
dr-x------ 2 vagrant vagrant 0 Feb 16 03:25 .
dr-xr-xr-x 9 vagrant vagrant 0 Feb 16 03:25 ..
lrwx------ 1 vagrant vagrant 64 Feb 16 03:25 0 -> /dev/pts/0
lrwx------ 1 vagrant vagrant 64 Feb 16 03:25 1 -> /dev/pts/0
lrwx------ 1 vagrant vagrant 64 Feb 16 03:25 2 -> /dev/pts/0
lr-x------ 1 vagrant vagrant 64 Feb 16 03:25 3 -> /tmp/do_not_delete_me
```
В данном случае, поток под номером 3 держит соединение с искомым файлом. Таким образом, чтобы обнулить данный файл,
достаточно направить пустую строку в данный поток:
```shell
echo "" > /proc/1988/fd/3
```
4. Занимают ли зомби-процессы какие-то ресурсы в ОС (CPU, RAM, IO)?
Нет, zombie-процессы не используют никаких ресурсов операционной системы.
Единственное, что они занимают - это идентификатор процесса.
5. На какие файлы вы увидели вызовы группы `open` за первую секунду работы утилиты `opensnoop-bpfcc`?
За первую секунду работы утилиты был произведён следующий вывод:
```shell
sudo opensnoop-bpfcc
PID COMM FD ERR PATH
833 vminfo 5 0 /var/run/utmp
619 dbus-daemon -1 2 /usr/local/share/dbus-1/system-services
619 dbus-daemon 19 0 /usr/share/dbus-1/system-services
619 dbus-daemon -1 2 /lib/dbus-1/system-services
619 dbus-daemon 19 0 /var/lib/snapd/dbus-1/system-services/
```
6. Какой системный вызов использует `uname -a`? Приведите цитату из man по этому системному вызову,
где описывается альтернативное местоположение в /proc, где можно узнать версию ядра и релиз ОС.
Утилита `uname` использует системный вызов `uname`, мануал к которому можно прочитать командой `man 2 uname`.
Цитата из мануала
> Part of the utsname information is also accessible via /proc/sys/kernel/{ostype, hostname, osrelease, version, domainname}.
PS. На виртуальной машине не было установленных мануалов для системных вызовов. Чтобы их установить,
нужно выполнить команду `sudo apt install manpages-dev`.
7. Чем отличается последовательность команд через `;` и через `&&` в bash?
Есть ли смысл использовать в bash `&&`, если применить `set -e`?
При использовании `&&` будет учитываться код выхода предыдущей выполненой команды. Если он не 0, то выполнение последовательности будет прервано.
В случае же `;` последовательность будет выполнена в любом случае.
В случае `set -e` параметр имеет следующее определение
>When this option is on, if a simple command fails for any of the reasons listed in Consequences of Shell Errors or returns an exit status value >0,
> and is not part of the compound list following a while, until, or if keyword,
> and is not a part of an AND or OR list,
> and is not a pipeline preceded by the ! reserved word, then the shell shall immediately exit.
То есть, если данная команда будет выполнена в связке с другими командами, то она не сможет прервать выполнение последовательности.
Таким образом, для данной команды использование `&&` и `;` будет иметь одинаковое поведение.
8. Из каких опций состоит режим bash `set -euxo pipefail` и почему его хорошо было бы использовать в сценариях?
Параметр `-e` уже был рассмотрен в предыдущем вопросе.
`-u` - пишет ошибку в stderr, когда скрипт пытается обратиться к несуществующей переменной, но при этом не останавливает его работу.
Если запущен интерактивный режим, то его работа никогда не прерывается.
`-x` - пишет в stderr трейс (последовательность выполнения системных вызовов) для каждой команды перед её выполнением.
`-o` - устанавливает настройку работы последовательности команд. В данном случае значение `pipefail` говорит о том,
что статус работы всей последовательности будет значение последней команды с ненулевым кодом выхода или 0, если все команды выполнились успешно.
9. Используя `-o stat` для `ps`, определите, какой наиболее часто встречающийся статус у процессов в системе.
Выполним данную команду на виртуальной машине
```shell
ps -o stat
STAT
Ss
R+
```
Таким образом, самым встречающимся статусом является `Ss`. Первая буква - это непосредственно статус (`S - interruptible sleep (waiting for an event to complete)`),
вторая - дополнительная информация (`s - is a session leader`).

View File

@@ -0,0 +1,220 @@
Выполнение [домашнего задания](https://github.com/netology-code/sysadm-homeworks/blob/devsys10/03-sysadmin-04-os/README.md)
по теме "3.4. Операционные системы, лекция 2".
## Q/A
1. Создайте самостоятельно простой unit-файл для [node_exporter](https://github.com/prometheus/node_exporter)
Для начала необходимо установить `node_exporter` в систему. Для этого воспользуемся [официальным гайдом](https://prometheus.io/docs/guides/node-exporter/#installing-and-running-the-node-exporter),
а именно:
```shell
wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
tar xvfz node_exporter-1.3.1.linux-amd64.tar.gz
cd node_exporter-1.3.1.linux-amd64
sudo mv node_exporter /usr/local/bin/
```
Проверим, что всё работает, выполнив команду
```shell
node_exporter --help
usage: node_exporter [<flags>]
Flags:
-h, --help Show context-sensitive help (also try --help-long and --help-man).
<...>
```
Затем, создадим простой unit-файл по пути `/etc/systemd/system`:
```shell
sudo touch /etc/systemd/system/prometheus_node_exporter.service
```
И добавим в него следующее содержимое:
```unit file (systemd)
[Unit]
Description=Prometheuth node exporter service
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
RestartSec=1
User=vagrant
ExecStart=/usr/local/bin/node_exporter
[Install]
WantedBy=multi-user.target
```
Затем запустим сервис, проверим, что он имеет статус "запущен", проверим работоспособность самого приложения и остановим выполнение:
```shell
sudo systemctl start prometheus_node_exporter
sudo systemctl status prometheus_node_exporter
● prometheus_node_exporter.service - Prometheuth node exporter service
Loaded: loaded (/etc/systemd/system/prometheus_node_exporter.service; disabled; vendor preset: enabled)
Active: active (running) since Wed 2022-02-23 03:52:14 UTC; 2s ago
Main PID: 1520 (node_exporter)
Tasks: 4 (limit: 1112)
Memory: 2.2M
CGroup: /system.slice/prometheus_node_exporter.service
└─1520 /usr/local/bin/node_exporter
Feb 23 03:52:14 vagrant node_exporter[1520]: ts=2022-02-23T03:52:14.087Z caller=node_exporter.go:115 level=info collector=thermal_zone
Feb 23 03:52:14 vagrant node_exporter[1520]: ts=2022-02-23T03:52:14.087Z caller=node_exporter.go:115 level=info collector=time
<...>
curl -I http://localhost:9100/metrics
HTTP/1.1 200 OK
Content-Type: text/plain; version=0.0.4; charset=utf-8
Date: Wed, 23 Feb 2022 04:01:31 GMT
sudo systemctl stop prometheus_node_exporter
sudo systemctl status prometheus_node_exporter
sudo systemctl status prometheus_node_exporter
● prometheus_node_exporter.service - Prometheuth node exporter service
Loaded: loaded (/etc/systemd/system/prometheus_node_exporter.service; disabled; vendor preset: enabled)
Active: inactive (dead)
<...>
Feb 23 04:02:22 vagrant systemd[1]: Stopping Prometheuth node exporter service...
Feb 23 04:02:22 vagrant systemd[1]: prometheus_node_exporter.service: Succeeded.
Feb 23 04:02:22 vagrant systemd[1]: Stopped Prometheuth node exporter service.
```
Для добавления конфигурации через файл, необходимо создать файл с переменной окружения `EXTRA_OPTS`:
```shell
sudo mkdir -p /usr/local/lib/node_exporter
sudo touch /usr/local/lib/node_exporter/conf.env
sudo chmod +r /usr/local/lib/node_exporter/conf.env
echo "EXTRA_OPTS=--collector.cpu.info" | sudo tee /usr/local/lib/node_exporter/conf.env
```
Затем сделать изменения в unit-файле:
* В блок `[Service]` добавить новую строку `EnvironmentFile=-/usr/local/lib/node_exporter/conf.env`
* В ключ `ExecStart` после полного пути до приложения добавить вывод переменной окружения `$EXTRA_OPTS`
Далее проверить, что приложение запускается с дополнительным флагом:
```shell
sudo systemctl start prometheus_node_exporter
sudo systemctl status prometheus_node_exporter
● prometheus_node_exporter.service - Prometheuth node exporter service
Loaded: loaded (/etc/systemd/system/prometheus_node_exporter.service; disabled; vendor preset: enabled)
Active: active (running) since Wed 2022-02-23 04:18:07 UTC; 4s ago
Main PID: 1820 (node_exporter)
Tasks: 4 (limit: 1112)
Memory: 2.3M
CGroup: /system.slice/prometheus_node_exporter.service
└─1820 /usr/local/bin/node_exporter --collector.cpu.info
<...>
```
2. Приведите несколько опций, которые вы бы выбрали для базового мониторинга хоста по CPU, памяти, диску и сети.
По умолчанию в `node_exporter` включено достаточно много различной информации (~1000 строк). Поэтому, на мой взгляд,
для начала стоит включить только следующие флаги:
* `--collector.disable-defaults` - отключение всех коллекторов по умолчанию
* `--collector.cpu` - отображение статистики по CPU
* `--collector.filesystem` - отображение статистики по файловой системе (например, количество использованного места)
* `--collector.meminfo` - отображение статистики по памяти
* `--collector.os` - отображение информации об операционной системе
* `--collector.time` - отображение информации о текущем системном времени
3. Ознакомьтесь с метриками, которые по умолчанию собираются `Netdata`, и с комментариями, которые даны к этим метрикам.
`netdata` отображает следующие метрики:
* `cpu` - утилизация CPU по всем ядрам
* `load` - текущая загрузка системы (количество процессов, которые используют или ожидают различные системные ресурсы), поделённая на три усреднённых значения.
* `disk` - текущие показатели I/O для физических дисков
* `ram` - информация об оперативной памяти
* `swap` - информация о файлах подкачки
* `network` - информация о пропускной способности физических сетевых интерфейсов
* и другие
Доступны так же подробные графики по каждой из категорий.
4. Можно ли по выводу `dmesg` понять, осознает ли ОС, что загружена не на настоящем оборудовании, а на системе виртуализации?
В `dmesg` можно найти следующий вывод `Detected virtualization oracle.` от `systemd`. Таким образом да, можно понять, что система осознаёт,
что находится внутри виртуальной машины, а не на физическом оборудовании.
5. Как настроен `sysctl fs.nr_open` на системе по-умолчанию? Какой другой существующий лимит не позволит достичь такого числа?
```shell
sysctl fs.nr_open
fs.nr_open = 1048576
```
`fs.nr_open` является системным лимитом на количество открытых файлов для пользователя.
Для текущей сессии bash можно посмотреть и изменить ограничение при помощи команды `ulimit -n`.
Для конкретных групп и пользователей ограничения можно задать в файле `/etc/security/limits.conf`.
6. Запустите любой долгоживущий процесс в отдельном неймспейсе процессов; покажите, что ваш процесс работает под PID 1 через `nsenter`.
Запустим процесс `bash` в изолированном пространстве имён:
```shell
sudo unshare -f --pid --mount-proc /bin/bash
ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.2 0.3 8960 3988 pts/0 S 03:22 0:00 /bin/bash
root 8 0.0 0.3 10616 3352 pts/0 R+ 03:22 0:00 ps aux
```
Затем, в отдельной терминальной сессии подключимся к созданной сессии, для начала, найдя её в списке запущенных процессов через `ps`.
```shell
ps au --forest -C unshare
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
vagrant 2177 0.0 0.4 9092 4632 pts/1 Ss 03:23 0:00 -bash
vagrant 2345 0.0 0.3 10616 3400 pts/1 R+ 03:34 0:00 \_ ps au --forest -C unshare
vagrant 2081 0.0 0.4 9092 4512 pts/0 Ss 03:21 0:00 -bash
root 2123 0.0 0.4 11016 4660 pts/0 S 03:22 0:00 \_ sudo unshare -f --pid --mount-proc /bin/bash
root 2124 0.0 0.0 7232 528 pts/0 S 03:22 0:00 \_ unshare -f --pid --mount-proc /bin/bash
root 2125 0.0 0.3 8960 3988 pts/0 S+ 03:22 0:00 \_ /bin/bash
sudo nsenter --target 2125 --pid --mount
ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 8960 3988 pts/0 S+ 03:22 0:00 /bin/bash
root 21 0.0 0.3 8960 4000 pts/1 S 03:35 0:00 -bash
root 52 0.0 0.3 10616 3252 pts/1 R+ 03:36 0:00 ps aux
```
7. Найдите информацию о том, что такое `:(){ :|:& };:`.
Запустите эту команду в своей виртуальной машине. Некоторое время все будет "плохо", после чего (минуты) ОС должна стабилизироваться.
Вызов `dmesg` расскажет, какой механизм помог автоматической стабилизации.
Как настроен этот механизм по-умолчанию, и как изменить число процессов, которое можно создать в сессии?
Команда - это `fork bomb`, которую можно разделить на следующие блоки:
```shell
:() # define a function named :, () defines a function in bash
{
: | :; # the pipe needs two instances of this function, which forks two shells
}
; # end function definition
: # run it
```
В `dmesg` можно увидеть следующее сообщение:
```shell
cgroup: fork rejected by pids controller in /user.slice/user-1000.slice/session-10.scope
```
Число процессов можно изменить с помощью команды `ulimit -u <num>`.

View File

@@ -0,0 +1,391 @@
Выполнение [домашнего задания](https://github.com/netology-code/sysadm-homeworks/blob/devsys10/03-sysadmin-05-fs/README.md)
по теме "3.5. Файловые системы".
## Q/A
1. Разряженные файлы
Суть таких файлов в том, чтобы разделить реальные данные последовательностью нуль-символов (`\x00`), которые не занимают реального места на физическом носителе.
При этом сами данные записываются на разных фрагментах на физическом диске.
Например, если есть разряжённый файл размером в 4KB, то он может быть поделён на 4 блока по 1KB и записан на диск именно такими фрагментами.
Это позволяет сделать запись туда, где доступно 1-2KB (например, после удаления другого файла),
но куда оригинальный файл целиком не поместится.
2. Могут ли файлы, являющиеся жесткой ссылкой на один объект, иметь разные права доступа и владельца? Почему?
Не могут. Причина в том, что жёсткие ссылки всегда ссылаются на одну `Inode` (идентификатор объекта файла внутри ОС).
То есть, все файлы, которые имеют одну `Inode` будут синхронизированы по: содержимому, правам доступа и другим мета-данным.
3. Реконфигурация виртуальной машины
В текущую конфигурацию [`vagrant`](/src/vagrant/Vagrantfile) добавлена конфигурация дисков:
```
config.vm.provider :virtualbox do |vb|
lvm_experiments_disk0_path = "/tmp/lvm_experiments_disk0.vmdk"
lvm_experiments_disk1_path = "/tmp/lvm_experiments_disk1.vmdk"
vb.customize ['createmedium', '--filename', lvm_experiments_disk0_path, '--size', 2560]
vb.customize ['createmedium', '--filename', lvm_experiments_disk1_path, '--size', 2560]
vb.customize ['storageattach', :id, '--storagectl', 'SATA Controller', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', lvm_experiments_disk0_path]
vb.customize ['storageattach', :id, '--storagectl', 'SATA Controller', '--port', 2, '--device', 0, '--type', 'hdd', '--medium', lvm_experiments_disk1_path]
end
```
После запуска ВМ (`vagrant up`) можно проверить, что файлы дисков из конфигурации были созданы:
```shell
ls /tmp | grep lvm
lvm_experiments_disk0.vmdk
lvm_experiments_disk1.vmdk
```
4. Используя `fdisk`, разбейте первый диск на 2 раздела: 2 Гб, оставшееся пространство.
Найдём диски, которые были подключены на предыдущем шаге
```shell
sudo fdisk -l
<...>
Disk /dev/sdb: 2.51 GiB, 2684354560 bytes, 5242880 sectors
Disk model: VBOX HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/sdc: 2.51 GiB, 2684354560 bytes, 5242880 sectors
Disk model: VBOX HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
<...>
```
Проведём операцию на диске `/dev/sdb`. Утилита `fdisk` - интерактивная, поэтому вводить команды нужно непосредственно после её запуска.
```shell
sudo fdisk /dev/sdb
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x0c6b10a9.
Command (m for help): g
Created a new GPT disklabel (GUID: F75C9D4B-5A47-7540-8A8D-D7448C95BCE5).
Command (m for help): n
Partition number (1-128, default 1): 1
First sector (2048-5242846, default 2048): 2048
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-5242846, default 5242846): +2G
Created a new partition 1 of type 'Linux filesystem' and of size 2 GiB.
Command (m for help): n
Partition number (2-128, default 2): 2
First sector (4196352-5242846, default 4196352):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (4196352-5242846, default 5242846):
Created a new partition 2 of type 'Linux filesystem' and of size 511 MiB.
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
```
Проверим, что всё прошло успешно
```shell
sudo fdisk -l /dev/sdb
Disk /dev/sdb: 2.51 GiB, 2684354560 bytes, 5242880 sectors
Disk model: VBOX HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: F75C9D4B-5A47-7540-8A8D-D7448C95BCE5
Device Start End Sectors Size Type
/dev/sdb1 2048 4196351 4194304 2G Linux filesystem
/dev/sdb2 4196352 5242846 1046495 511M Linux filesystem
```
5. Используя `sfdisk`, перенесите данную таблицу разделов на второй диск.
Перенесём таблицу разделов с `/dev/sdb` на `/dev/sdc`.
```shell
sudo sfdisk --dump /dev/sdb > /tmp/sdb.dump
sudo sfdisk /dev/sdc < /tmp/sdb.dump
Checking that no-one is using this disk right now ... OK
Disk /dev/sdc: 2.51 GiB, 2684354560 bytes, 5242880 sectors
Disk model: VBOX HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
>>> Script header accepted.
>>> Script header accepted.
>>> Script header accepted.
>>> Script header accepted.
>>> Script header accepted.
>>> Script header accepted.
>>> Created a new GPT disklabel (GUID: F75C9D4B-5A47-7540-8A8D-D7448C95BCE5).
/dev/sdc1: Created a new partition 1 of type 'Linux filesystem' and of size 2 GiB.
/dev/sdc2: Created a new partition 2 of type 'Linux filesystem' and of size 511 MiB.
/dev/sdc3: Done.
New situation:
Disklabel type: gpt
Disk identifier: F75C9D4B-5A47-7540-8A8D-D7448C95BCE5
Device Start End Sectors Size Type
/dev/sdc1 2048 4196351 4194304 2G Linux filesystem
/dev/sdc2 4196352 5242846 1046495 511M Linux filesystem
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
```
Проверим, что всё прошло успешно
```shell
sudo fdisk -l /dev/sdc
Disk /dev/sdc: 2.51 GiB, 2684354560 bytes, 5242880 sectors
Disk model: VBOX HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: F75C9D4B-5A47-7540-8A8D-D7448C95BCE5
Device Start End Sectors Size Type
/dev/sdc1 2048 4196351 4194304 2G Linux filesystem
/dev/sdc2 4196352 5242846 1046495 511M Linux filesystem
```
6. Соберите `mdadm` `RAID1` на паре разделов 2 Гб.
Разделы, которые необходимо объединить в `RAID1`: `/dev/sdb1` и `/dev/sdc1`.
```shell
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
```
7. Соберите `mdadm` `RAID0` на второй паре маленьких разделов
Разделы, которые необходимо объединить в `RAID0`: `/dev/sdb2` и `/dev/sdc2`.
```shell
sudo mdadm --create /dev/md1 --level=0 --raid-devices=2 /dev/sdb2 /dev/sdc2
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
```
8. Создайте 2 независимых PV на получившихся md-устройствах
```shell
sudo pvcreate /dev/md0
Physical volume "/dev/md0" successfully created.
sudo pvcreate /dev/md1
Physical volume "/dev/md1" successfully created.
sudo pvdisplay
"/dev/md0" is a new physical volume of "<2.00 GiB"
--- NEW Physical volume ---
PV Name /dev/md0
VG Name
PV Size <2.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID hNpE2z-h7m3-W1HT-dBIh-Xm24-6Zal-dhtPfl
"/dev/md1" is a new physical volume of "1017.00 MiB"
--- NEW Physical volume ---
PV Name /dev/md1
VG Name
PV Size 1017.00 MiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID PB8hEQ-bZGA-M6Xe-tOQV-1CAb-DRSf-syoUSA
```
9. Создайте общую volume-group на этих двух PV.
```shell
sudo vgcreate test_vg /dev/md0 /dev/md1
Volume group "test_vg" successfully created
sudo vgdisplay
--- Volume group ---
VG Name test_vg
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 2
Act PV 2
VG Size <2.99 GiB
PE Size 4.00 MiB
Total PE 765
Alloc PE / Size 0 / 0
Free PE / Size 765 / <2.99 GiB
VG UUID 7xcN3Z-o9Ca-iXl2-5eao-iA4e-cEVJ-YgSajr
```
10. Создайте LV размером 100 Мб, указав его расположение на PV с `RAID0`.
```shell
sudo lvcreate --size=100MB test_vg /dev/md1
Logical volume "lvol0" created.
sudo lvdisplay
--- Logical volume ---
LV Path /dev/test_vg/lvol0
LV Name lvol0
VG Name test_vg
LV UUID 1fJJLO-zJeY-924D-O9gn-N1Cz-fyQ6-mnA7Z3
LV Write Access read/write
LV Creation host, time vagrant, 2022-03-02 02:55:17 +0000
LV Status available
# open 0
LV Size 100.00 MiB
Current LE 25
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 4096
Block device 253:1
```
11. Создайте `mkfs.ext4` ФС на получившемся `LV`
```shell
sudo mkfs.ext4 /dev/test_vg/lvol0
mke2fs 1.45.5 (07-Jan-2020)
Creating filesystem with 25600 4k blocks and 25600 inodes
Allocating group tables: done
Writing inode tables: done
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: done
```
12. Смонтируйте этот раздел в любую директорию.
```shell
mkdir /tmp/new
sudo mount /dev/test_vg/lvol0 /tmp/new
```
13. Поместите туда тестовый файл.
```shell
sudo wget https://mirror.yandex.ru/ubuntu/ls-lR.gz -O /tmp/new/test.gz
--2022-03-02 03:04:07-- https://mirror.yandex.ru/ubuntu/ls-lR.gz
Resolving mirror.yandex.ru (mirror.yandex.ru)... 213.180.204.183, 2a02:6b8::183
Connecting to mirror.yandex.ru (mirror.yandex.ru)|213.180.204.183|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 22388361 (21M) [application/octet-stream]
Saving to: /tmp/new/test.gz
2022-03-02 03:04:09 (9.33 MB/s) - /tmp/new/test.gz saved [22388361/22388361]
```
14. Прикрепите вывод `lsblk`.
```shell
sudo lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 55.4M 1 loop /snap/core18/2128
loop2 7:2 0 70.3M 1 loop /snap/lxd/21029
loop3 7:3 0 55.5M 1 loop /snap/core18/2284
loop4 7:4 0 43.6M 1 loop /snap/snapd/14978
loop5 7:5 0 61.9M 1 loop /snap/core20/1361
loop6 7:6 0 67.9M 1 loop /snap/lxd/22526
sda 8:0 0 64G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 63G 0 part
└─ubuntu--vg-ubuntu--lv 253:0 0 31.5G 0 lvm /
sdb 8:16 0 2.5G 0 disk
├─sdb1 8:17 0 2G 0 part
│ └─md0 9:0 0 2G 0 raid1
└─sdb2 8:18 0 511M 0 part
└─md1 9:1 0 1017M 0 raid0
└─test_vg-lvol0 253:1 0 100M 0 lvm /tmp/new
sdc 8:32 0 2.5G 0 disk
├─sdc1 8:33 0 2G 0 part
│ └─md0 9:0 0 2G 0 raid1
└─sdc2 8:34 0 511M 0 part
└─md1 9:1 0 1017M 0 raid0
└─test_vg-lvol0 253:1 0 100M 0 lvm /tmp/new
```
15. Протестируйте целостность файла
```shell
sudo gzip -t /tmp/new/test.gz
echo $?
0
```
16. Используя `pvmove`, переместите содержимое PV с `RAID0` на `RAID1`.
```shell
sudo pvmove /dev/md1 /dev/md0
/dev/md1: Moved: 16.00%
/dev/md1: Moved: 100.00%
```
17. Сделайте `--fail` на устройство в вашем `RAID1` md.
```shell
sudo mdadm --fail /dev/md0 /dev/sdb1
mdadm: set /dev/sdb1 faulty in /dev/md0
```
18. Подтвердите выводом `dmesg`, что `RAID1` работает в деградированном состоянии
```shell
sudo dmesg | tail -n 5
[ 2711.025093] 02:44:35.853387 timesync vgsvcTimeSyncWorker: Radical guest time change: 81 954 170 807 000ns (GuestNow=1 646 189 075 853 355 000 ns GuestLast=1 646 107 121 682 548 000 ns fSetTimeLastLoop=true )
[ 3814.237420] EXT4-fs (dm-1): mounted filesystem with ordered data mode. Opts: (null)
[ 3814.237429] ext4 filesystem being mounted at /tmp/new supports timestamps until 2038 (0x7fffffff)
[ 4328.371203] md/raid1:md0: Disk failure on sdb1, disabling device.
md/raid1:md0: Operation continuing on 1 devices.
```
19. Протестируйте целостность файла, несмотря на "сбойный" диск он должен продолжать быть доступен
```shell
sudo gzip -t /tmp/new/test.gz
echo $?
0
```

View File

@@ -0,0 +1,215 @@
Выполнение [домашнего задания](https://github.com/netology-code/sysadm-homeworks/blob/devsys10/03-sysadmin-06-net/README.md)
по теме "3.6. Компьютерные сети, лекция 1".
## Q/A
1. Работа c HTTP через телнет.
```shell
telnet stackoverflow.com 80
Trying 151.101.1.69...
Connected to stackoverflow.com.
Escape character is '^]'.
GET /questions HTTP/1.0
HOST: stackoverflow.com
HTTP/1.1 301 Moved Permanently
cache-control: no-cache, no-store, must-revalidate
location: https://stackoverflow.com/questions
x-request-guid: 345ccd64-092f-4bed-a6bb-f55d978ab74a
feature-policy: microphone 'none'; speaker 'none'
content-security-policy: upgrade-insecure-requests; frame-ancestors 'self' https://stackexchange.com
Accept-Ranges: bytes
Date: Wed, 09 Mar 2022 02:50:15 GMT
Via: 1.1 varnish
Connection: close
X-Served-By: cache-hhn4072-HHN
X-Cache: MISS
X-Cache-Hits: 0
X-Timer: S1646794215.885878,VS0,VE156
Vary: Fastly-SSL
X-DNS-Prefetch-Control: off
Set-Cookie: prov=a65f8cdf-ae94-33aa-2d32-b4ba53feba61; domain=.stackoverflow.com; expires=Fri, 01-Jan-2055 00:00:00 GMT; path=/; HttpOnly
```
В ответ пришёл статус код `301`, который означает постоянное перемещение с запрашиваемой страницы.
2. Повторите задание 1 в браузере, используя консоль разработчика F12.
Код ответа при заходе на сайт `http://stackoverflow.com`: `Status Code: 307 Internal Redirect`.
Наиболее долгих по загрузке запрос - это запрос на загрузку самой страницы после редиректа (`https://stackoverflow.com/`).
Скриншот консоли браузера:
![stackoverflow.png](stackoverflow.png)
3. Какой IP адрес у вас в интернете?
Чтобы узнать текущий внешний ip-адрес, можно воспользоваться онлайн сервисами, такими как [myip.com](https://www.myip.com/) или [whoer.net](https://whoer.net/).
В дополнение к этому, можно использовать только консоль и команду `dig`:
```shell
dig +short myip.opendns.com @resolver1.opendns.com
46.181.144.146
dig TXT +short o-o.myaddr.l.google.com @ns1.google.com
"46.181.144.146"
```
Ответ: `46.181.144.146`.
4. Какому провайдеру принадлежит ваш IP адрес? Какой автономной системе AS?
```shell
whois 46.181.144.146
<...>
% Information related to '46.181.128.0/18AS39927'
route: 46.181.128.0/18
descr: Goodline.info
origin: AS39927
mnt-by: ELT-MNT
created: 2010-12-22T11:28:33Z
last-modified: 2010-12-22T11:28:33Z
source: RIPE
```
Ответ: оператор - `Goodline.info`, AS - `AS39927`.
5. Через какие сети проходит пакет, отправленный с вашего компьютера на адрес 8.8.8.8? Через какие AS?
По умолчанию утилита `traceroute` не установлена в системе ubuntu. Для её установки достаточно выполнить команду
```shell
sudo apt install traceroute
```
Ответ:
```shell
traceroute -A 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1 router.asus.com (192.168.1.1) [*] 5.960 ms 3.192 ms 3.129 ms
2 46-181-144-129.shah-95-kmr-cr01-6500.net.elt (46.181.144.129) [AS39927] 6.523 ms 6.484 ms 6.446 ms
3 172.16.23.174 (172.16.23.174) [*] 6.577 ms 6.539 ms 6.502 ms
4 172-16-22-178.kras-136-kmr-asbr01-asr.net.elt (172.16.22.178) [*] 5.984 ms 10.393 ms 10.354 ms
5 host_91_221_180_4.milecom.ru (91.221.180.4) [AS13094] 56.869 ms 56.832 ms 56.796 ms
6 108.170.250.34 (108.170.250.34) [AS15169] 54.496 ms 51.426 ms 108.170.250.66 (108.170.250.66) [AS15169] 51.329 ms
7 * * *
8 108.170.232.251 (108.170.232.251) [AS15169] 72.746 ms 72.14.238.168 (72.14.238.168) [AS15169] 62.523 ms 172.253.65.82 (172.253.65.82) [AS15169] 64.747 ms
9 216.239.46.139 (216.239.46.139) [AS15169] 68.148 ms 72.14.236.73 (72.14.236.73) [AS15169] 69.164 ms 172.253.51.241 (172.253.51.241) [AS15169] 69.121 ms
10 * * *
11 * * *
12 * * *
13 * * *
14 * * *
15 * * *
16 * * *
17 * * *
18 * * *
19 * dns.google (8.8.8.8) [AS15169] 57.661 ms 56.687 ms
```
6. Повторите задание 5 в утилите mtr. На каком участке наибольшая задержка - delay?
```shell
mtr -w 8.8.8.8
Start: 2022-03-09T10:25:09+0700
HOST: host Loss% Snt Last Avg Best Wrst StDev
1.|-- router.asus.com 0.0% 10 2.9 3.3 2.5 4.6 0.8
2.|-- 46-181-144-129.shah-95-kmr-cr01-6500.net.elt 0.0% 10 4.0 4.0 2.5 5.5 1.1
3.|-- 172.16.23.174 0.0% 10 4.1 4.4 3.1 6.0 0.9
4.|-- 172-16-22-178.kras-136-kmr-asbr01-asr.net.elt 0.0% 10 4.3 4.2 3.5 5.5 0.6
5.|-- host_91_221_180_4.milecom.ru 0.0% 10 57.9 55.7 54.5 57.9 1.0
6.|-- 108.170.250.146 0.0% 10 55.7 55.4 54.4 56.4 0.7
7.|-- 209.85.249.158 50.0% 10 58.7 63.8 58.7 81.0 9.6
8.|-- 216.239.57.222 0.0% 10 62.5 62.3 61.5 64.3 0.9
9.|-- 142.250.238.181 0.0% 10 66.4 66.0 65.3 66.9 0.5
10.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
11.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
12.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
13.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
14.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
15.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
16.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
17.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
18.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
19.|-- dns.google 0.0% 10 58.5 58.5 57.6 60.3 0.8
```
Наибольшая задержка была на 7-ом хопе с худшим показателем в 81ms.
7. Какие DNS сервера отвечают за доменное имя `dns.google`? Какие A записи?
```shell
dig dns.google
; <<>> DiG 9.16.1-Ubuntu <<>> dns.google
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 59679
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;dns.google. IN A
;; ANSWER SECTION:
dns.google. 370 IN A 8.8.4.4
dns.google. 370 IN A 8.8.8.8
;; Query time: 8 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Ср мар 09 10:28:19 +07 2022
;; MSG SIZE rcvd: 71
```
Ответ: dns-сервера с ip-адресами `8.8.4.4` и `8.8.8.8`. Оба адреса являются `A`-записями.
9. Проверьте PTR записи для IP адресов из задания 7. Какое доменное имя привязано к IP?
```shell
dig -x 8.8.4.4
; <<>> DiG 9.16.1-Ubuntu <<>> -x 8.8.4.4
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33111
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;4.4.8.8.in-addr.arpa. IN PTR
;; ANSWER SECTION:
4.4.8.8.in-addr.arpa. 53775 IN PTR dns.google.
;; Query time: 4 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Ср мар 09 10:33:09 +07 2022
;; MSG SIZE rcvd: 73
dig -x 8.8.8.8
; <<>> DiG 9.16.1-Ubuntu <<>> -x 8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3893
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;8.8.8.8.in-addr.arpa. IN PTR
;; ANSWER SECTION:
8.8.8.8.in-addr.arpa. 6386 IN PTR dns.google.
;; Query time: 4 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Ср мар 09 10:33:34 +07 2022
;; MSG SIZE rcvd: 73
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 349 KiB

View File

@@ -0,0 +1,119 @@
Выполнение [домашнего задания](https://github.com/netology-code/sysadm-homeworks/blob/devsys10/03-sysadmin-07-net/README.md)
по теме "3.7. Компьютерные сети, лекция 2".
## Q/A
1. Проверьте список доступных сетевых интерфейсов на вашем компьютере. Какие команды есть для этого в Linux и в Windows?
В Linux можно выполнить команду `ip link`, которая покажет все сетевые интерфейсы, включая виртуальные.
Для Windows аналогом данной команды является вызов `ipconfig /all`.
2. Какой протокол используется для распознавания соседа по сетевому интерфейсу? Какой пакет и команды есть в Linux для этого?
Для получения информации о соседнем устройстве используется протокол [LLDP](https://en.wikipedia.org/wiki/Link_Layer_Discovery_Protocol).
Данный протокол в ОС Linux реализован в утилите `lldpd`.
3. Какая технология используется для разделения L2 коммутатора на несколько виртуальных сетей? Какой пакет и команды есть в Linux для этого? Приведите пример конфига.
Технология имеет название [VLAN](https://en.wikipedia.org/wiki/Virtual_LAN).
В Linux для управления виртуальными сетями используется пакет `vlan`, а именно утилита `vconfig` (устарела, рекомендуется использовать утилиту `ip route`).
Вся конфигурация так или иначе хранится в файле `/etc/network/interfaces`, содержимое которого будет выглядеть примерно так
```
auto eth0.1400
iface eth0.1400 inet static
address 192.168.1.1
netmask 255.255.255.0
vlan_raw_device eth0
```
4. Какие типы агрегации интерфейсов есть в Linux? Какие опции есть для балансировки нагрузки? Приведите пример конфига.
В конфигурации Linux предусмотрены следующие типы агрегации:
* static/manual - ручная статическая настройка
* dynamic - динамическая
Типы балансировки нагрузки:
* `balance-rr` - балансировка по принципу [Round-robin](https://en.wikipedia.org/wiki/Round-robin_scheduling).
* `active-backup` - один активный интерфейс, в случае выхода из строя которого, трафик перенаправляется на запасной.
* `balance-xor` - "эксклюзивный ИЛИ", при котором происходит сопоставление MAC-адреса из запроса к MAC-адресу интерфейса. Эта связь используется в дальнейшем для всех запросов.
* `broadcase` - транслирование запроса на все интерфейсы.
* `802.3ad` - динамическая политика агрегации по стандарту [IEEE 802.3ad](https://www.ieee802.org/3/hssg/public/apr07/frazier_01_0407.pdf)
* `balance-tlb` - балансировка трафика в зависимости от нагрузки интерфейсов.
* `balance-alb` - надстройка над `balance-tlb`, убирающая необходимость специальной поддержки со стороны интерфейса.
Настройка производится в том же файле `/etc/network/interfaces`. Пример конфигурации с балансировкой нагрузки по типу `active-backup`,
когда основным является интерфейс `eth0`, а `wlan0` - запасным, который активируется при выходе из строя основного:
```
# Define slaves
auto eth0
iface eth0 inet manual
bond-master bond0
bond-primary eth0
bond-mode active-backup
auto wlan0
iface wlan0 inet manual
wpa-conf /etc/network/wpa.conf
bond-master bond0
bond-primary eth0
bond-mode active-backup
# Define master
auto bond0
iface bond0 inet dhcp
bond-slaves none
bond-primary eth0
bond-mode active-backup
bond-miimon 100
```
5. Сколько IP адресов в сети с маской `/29` ? Сколько `/29` подсетей можно получить из сети с маской `/24`. Приведите несколько примеров `/29` подсетей внутри сети `10.10.10.0/24`.
Всего в сети с маской `/29` находятся 8 IP адресов, 2 из которых зарезервированы.
Всего в сети с маской `/24` могут использоваться 256 IP адреса.
Таким образом, если на каждую сеть с маской `/29` нужен пул из 8 адресов,
то в оригинальную сеть поместится 256 / 8 = 32 подсети с маской `/29`.
Примеры подсетей с маской `/29` внутри сети `10.10.10.0/24`:
* `10.10.10.1/29`
* `10.10.10.9/29`
* `10.10.10.19/29`
6. Задача: вас попросили организовать стык между 2-мя организациями. Диапазоны `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16` уже заняты. Из какой подсети допустимо взять частные IP адреса? Маску выберите из расчета максимум 40-50 хостов внутри подсети.
Так как самые ходовые сети, используемые для внутренних сетей, уже заняты, то остаётся только вариант с сетью `100.64.0.0/10`.
Если рассчитывать на 40-50 хостов в рамках данной сети, то можно взять подсеть `100.64.0.0/26`,
у которой будет диапазон доступных адресов `100.64.0.1 - 100.64.0.62`.
7. Как проверить ARP таблицу в Linux, Windows? Как очистить ARP кеш полностью? Как из ARP таблицы удалить только один нужный IP?
Работа с ARP-таблицами:
* linux
```shell
# вывод данных таблицы
ip neigh
# полная очистка
ip neigh flush all
# удаление одного ip-адреса
ip neigh del <ip-address> lladdr <link-layer address> <device>
# пример удаления адреса
ip neigh del 192.168.1.3 lladdr 02:01:02:03:04:05 dev eth0
```
* windows
```shell
# вывод данных таблицы
arp -a
# полная очистка
arp -d *
# удаление одного ip-адреса
arp -d <ip-address>
# пример удаление адреса
arp -d 192.168.1.3
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

View File

@@ -0,0 +1 @@
<mxfile host="app.diagrams.net" modified="2022-03-17T03:03:17.629Z" agent="5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36 OPR/83.0.4254.70" etag="NbVIYXF-muBXRySHjtu2" version="14.6.7" type="device"><diagram name="Page-1" id="c37626ed-c26b-45fb-9056-f9ebc6bb27b6">7Vpbc5s6EP41fgzDTVwec23PTM9MZjLT9jx1ZJCBE0BUyLHdX39WRoAExHEcu2566swEtBIrsd+3q13ZM+e6WH9guEr/pjHJZ7YZr2fOzcy2LTMM4SIkm0YS+lYjSFgWy0G94CH7QdonpXSZxaTWBnJKc55VujCiZUkirskwY3SlD1vQXJ+1wgkZCR4inI+lX7KYp1JqmWbf8ZFkSSqnDpDsmOPoMWF0Wcr5SlqSpqfArRo5tE5xTFeKyLmdOdeMUt7cFetrkguzthZrnrt7prdbMiMl3+uByMeeP18Ei9ixHXNxYaFGxRPOl9IOf5WcsJJwuWK+aQ0EqgALaFzBa1RCGOV0CZqvVmnGyUOFIyFcAT1AlvIih5YFt1vbELEEs3m4sYFoRLTIoraDM/rY2V48uKAlv8NFlgtKfSYsxiWWYskfC0x4NbaCNMwTYZysFZG0ygdCC8LZBobIXrdFSJIX+dIwK4UKLeCpwoKOHljSL+l09zjAjYRiT1iQPbZ+DGyVzS3DNBPneE7yq46I1zSnrB9Yc8z4XSbm31qalPGl8Jh+BEiUfh0J+whI1HTJIvLM27qBdHfMEsJfYKqww05EGckxz550r34LOpeLB/Or/z2J2Wd8Yf24nJv+lwt75Dc7EaOMpzShJc5ve+nAMfoxnyitJLD/Es430sR4yakO+0tAknXGv4p7A8nWP0rPzVptbJTGPWEZ2ImwjjBgM6kIte2tKiPs2r26bWujtoYKJ7E8DnMm4XorV+Sj9zSD5fVRI/QNU/nYWgxxTaQrbF5F6lCj9EAtQnowcryBouZ1R4qACnijDKvEgHrX8pE2j+2HO9cFr7trPNw0K+i9qjP1YWGwhXeXl7V7UbFORF5iRFkdUQM8C8hWy6vuNDGu087pFuAsbbScwaSOF8BbtiFQ6VlsP5PBUWwzGSQSn0QQvqd1xjNaQt+cck4LZcBlniWigwv33ndb/ImboCvixCSF1W3QDMfboO8apneiUGtNkMDLubSBxgbv+5K2HRf11jqXMMByq3XfCXeJvKpaog7rfqAjvBpQV0SHzvYRrAGdOQUewBUSrBVlj+0awDDNMvSlzVkrsULbsLzAsAyIDXe2++yD7ytpG5FzgsLP8tXx9ThpTSRtAOFE0uYcIWmb5Kp7aMACm1bbkPUNl/G3CrbLKiUM57VRRTow26hO2O0TEcH91wppWLYiUjZhF8JvnpUwaVuzmceBHiLTIFCNkPeDiTB1KtzHZdSbcc9x1Rj1D/aDbQqFo21qhH444fbeqYoB71D0CxqTQkKfQgJfGxFM19wfFXk1QJ8U3xHRrm7E33GQ9wZej8a4O+4YdxScCHf/ZdzHFZpWvvVllVpVdX2vKan6Ws/01WLPcF9d7s0Oqs52JW8vFmjuNPAKslOnL63sjXWcPTj9sb3BPrFv5WYPMpLucPOFyu2AYmnSinvUS+cgpGdrxw+G/R4Yic7JSBf5hhkqHz3RDfzD+OkMThaG+dCJ6RkejZ5HJGcQ6NxE74Gc3jnJiQJIwGzPD4IQql3fHJLTNWzTRMgMPRRaqN2RX8tVzxxUdz85lrbTKWyN06gaMRbSGa7TVM+BJI3V/EyKRhnVMPEqsjjeHhRP1ep6gX6E7MpxBgZH43LanWCVfaqiyhofsv/eCIDLDCqb7qTibBg4/zcMwoEX+OdG4OAzpQL+G/zpzxHCONR5+jcZEwcIyJnYP51TYbzH+dE5Eve2dGxSI+s9ZEbWWStJV3wR8mzebjuBceB3gkPGWrY1VHXqfGh8yvV77wSuNdqN7ZPtBdDsfwbUQNb/zMq5/Q8=</diagram></mxfile>

View File

@@ -0,0 +1,231 @@
Выполнение [домашнего задания](https://github.com/netology-code/sysadm-homeworks/blob/devsys10/03-sysadmin-08-net/README.md)
по теме "3.8. Компьютерные сети, лекция 3".
## Q/A
1. Подключитесь к публичному маршрутизатору в интернет. Найдите маршрут к вашему публичному IP
```shell
telnet route-views.routeviews.org
Trying 128.223.51.103...
Connected to route-views.routeviews.org.
<...>
User Access Verification
Username: rviews
route-views>show ip route 46.181.144.146
Routing entry for 46.180.0.0/15
Known via "bgp 6447", distance 20, metric 0
Tag 6939, type external
Last update from 64.71.137.241 7w0d ago
Routing Descriptor Blocks:
* 64.71.137.241, from 64.71.137.241, 7w0d ago
Route metric is 0, traffic share count is 1
AS Hops 3
Route tag 6939
MPLS label: none
route-views>show bgp 46.181.144.146
BGP routing table entry for 46.180.0.0/15, version 150820343
Paths: (23 available, best #22, table default)
Not advertised to any peer
Refresh Epoch 1
3333 31133 39927, (aggregated by 65423 192.168.21.211)
193.0.0.56 from 193.0.0.56 (193.0.0.56)
Origin IGP, localpref 100, valid, external, atomic-aggregate
path 7FE1040964D8 RPKI State not found
rx pathid: 0, tx pathid: 0
Refresh Epoch 1
8283 1299 39927, (aggregated by 65423 192.168.21.136)
94.142.247.3 from 94.142.247.3 (94.142.247.3)
Origin IGP, metric 0, localpref 100, valid, external, atomic-aggregate
Community: 1299:30000 8283:1 8283:101
unknown transitive attribute: flag 0xE0 type 0x20 length 0x18
value 0000 205B 0000 0000 0000 0001 0000 205B
0000 0005 0000 0001
path 7FE0A25887D8 RPKI State not found
rx pathid: 0, tx pathid: 0
Refresh Epoch 1
4901 6079 31133 39927, (aggregated by 65423 192.168.21.211)
162.250.137.254 from 162.250.137.254 (162.250.137.254)
Origin IGP, localpref 100, valid, external, atomic-aggregate
Community: 65000:10100 65000:10300 65000:10400
path 7FE154880220 RPKI State not found
rx pathid: 0, tx pathid: 0
<...>
```
2. Создайте dummy0 интерфейс в Ubuntu. Добавьте несколько статических маршрутов. Проверьте таблицу маршрутизации.
Создание dummy-интерфейса:
```shell
echo "dummy" | sudo tee -a /etc/modules
sudo touch /etc/modprobe.d/dummy.conf
echo "options dummy numdummies=1" | sudo tee /etc/modprobe.d/dummy.conf
sudo ip link add dummy0 type dummy
```
Добавление маршрутов и вывод таблицы маршрутизации:
```shell
sudo ip route add 10.2.2.2/32 dev eth0
sudo ip route add 10.2.2.3/32 via 10.0.2.16
ip route
default via 10.0.2.2 dev eth0 proto dhcp src 10.0.2.15 metric 100
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15
10.0.2.2 dev eth0 proto dhcp scope link src 10.0.2.15 metric 100
10.2.2.2 dev eth0 scope link
10.2.2.3 via 10.0.2.16 dev eth0
```
3. Проверьте открытые TCP порты в Ubuntu, какие протоколы и приложения используют эти порты? Приведите несколько примеров.
Для вывода открытых TCP-портов используем утилиту `ss` со следующими флагами:
* `-t` вывод только TCP-портов
* `-l` вывод портов в состоянии `LISTEN`, то есть открытые для прослушивания
* `-n` использовать числовое представление портов (например, `:ssh` -> `:22`)
*
```shell
ss -tln
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
```
В данном случае открыты только порты для соединения по `ssh` (порты `:22`) и для [`systemd-resolved`](https://www.freedesktop.org/software/systemd/man/systemd-resolved.service.html) (порт `:53`).
4. Проверьте используемые UDP сокеты в Ubuntu, какие протоколы и приложения используют эти порты?
По аналогии с предыдущим заданием используем утилиту `ss`, заменив флаг `-t` на `-u`
```shell
ss -ulpn
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:*
UNCONN 0 0 10.0.2.15%eth0:68 0.0.0.0:*
```
Порт `:53` предназначается для использования [`systemd-resolved`](https://www.freedesktop.org/software/systemd/man/systemd-resolved.service.html),
а порт `68` используется для получения информации о динамической IP-адресации от DHCP-сервера.
5. Используя diagrams.net, создайте L3 диаграмму вашей домашней сети или любой другой сети, с которой вы работали.
В качестве сети взята стандартная домашняя сеть с wi-fi-роутером.
Файл [network.xml](network.xml) для открытия в [diagrams.net](https://diagrams.net).
![network.png](network.png)
6. Установите Nginx, настройте в режиме балансировщика TCP или UDP.
Установка nginx:
```shell
sudo apt install nginx
sudo service nginx status
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2022-03-17 03:14:31 UTC; 24s ago
Docs: man:nginx(8)
Main PID: 1830 (nginx)
Tasks: 3 (limit: 1107)
Memory: 5.0M
CGroup: /system.slice/nginx.service
├─1830 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
├─1831 nginx: worker process
└─1832 nginx: worker process
```
Далее, определим, что есть два ip-адреса, на которые необходимо сделать проксирование и балансировку трафика:
* `10.2.2.2`
* `10.2.2.3`
Оба ip-адреса слушают следующие порты: `:25` - upd-трафик, `:80` - tcp-трафик.
Настроим nginx на прослушивание порта `:80` для обоих типов трафика с дальнейшей балансировкой и проксированием.
Добавим новый блок конфигурации в файл `/etc/nginx/nginx.conf`:
```
stream {
upstream tcp_backend {
server 10.2.2.2:80;
server 10.2.2.3:80;
}
upstream upd_backend {
server 10.2.2.2:25;
server 10.2.2.3:25;
}
server {
listen 80;
proxy_pass tcp_backend;
}
server {
listen 80 udp;
proxy_pass upd_backend;
}
}
```
Дополнительно, нужно убрать конфигурацию приветственной страницы, которая работает по умолчанию и слушает порт `80`:
```shell
sudo rm -f /etc/nginx/sites-enabled/default
```
Проверим, что конфигурация в порядке:
```shell
sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
```
Затем нужно применить конфигурацию nginx
```shell
sudo nginx -s reload
sudo systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2022-03-21 03:37:24 UTC; 6s ago
Docs: man:nginx(8)
Process: 1364 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Process: 1367 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Main PID: 1376 (nginx)
Tasks: 3 (limit: 1107)
Memory: 3.3M
CGroup: /system.slice/nginx.service
├─1376 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
├─1377 nginx: worker process
└─1378 nginx: worker process
```
Проверим, что nginx принимает соединение на порт `80`
```shell
curl -v --max-time 5 http://localhost:80
* Trying 127.0.0.1:80...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> Host: localhost
> User-Agent: curl/7.68.0
> Accept: */*
>
* Operation timed out after 5001 milliseconds with 0 bytes received
* Closing connection 0
curl: (28) Operation timed out after 5001 milliseconds with 0 bytes received
```
В данном случае добавили `--max-time 5`, чтобы быстрее получить ошибку, так как nginx пытается проксировать запрос на несуществующий адрес.

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

View File

@@ -0,0 +1,268 @@
Выполнение [домашнего задания](https://github.com/netology-code/sysadm-homeworks/blob/devsys10/03-sysadmin-09-security/README.md)
по теме "3.9. Элементы безопасности информационных систем".
## Q/A
1. Установите Bitwarden плагин для браузера. Зарегестрируйтесь и сохраните несколько паролей.
![bitwarden](bitwarden.png)
2. Установите Google authenticator на мобильный телефон. Настройте вход в Bitwarden акаунт через Google authenticator OTP.
Заместо `Google Authenticator` использовал приложение `Microsoft Authenticator`.
![birtwarden](bitwarden-2fa.png)
3. Установите apache2, сгенерируйте самоподписанный сертификат, настройте тестовый сайт для работы по HTTPS.
Вместо `apache2` будем производить настройку уже установленного в виртуальную машину `nginx` (установка производилась в [дз 3.8:6](/src/homework/03-sysadmin/3.8sysadmin/3.8/readme.md#Q/A)).
Первым шагом необходимо сгенерировать сертификат:
```shell
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/nginx-selfsigned.key \
-out /etc/ssl/certs/nginx-selfsigned.crt \
-subj "/C=RU/ST=Moscow/L=Moscow/O=Company Name/OU=Org/CN=site.localhost"
sudo ls -lah /etc/ssl/private/ | grep nginx
-rw------- 1 root root 1.7K Mar 28 03:01 nginx-selfsigned.key
sudo ls -lah /etc/ssl/certs/ | grep nginx
-rw-r--r-- 1 root root 1.4K Mar 28 03:01 nginx-selfsigned.crt
```
Воспользуемся [конфигуратором](https://ssl-config.mozilla.org/#server=nginx&version=1.17.7&config=modern&openssl=1.1.1k&guideline=5.6),
чтобы сгенерировать основу конфигурации для сервера. Получим следующую конфигурацию, которую расположим в файле `/etc/site-available/ssl`:
```
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name site.localhost;
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
ssl_session_tickets off;
# modern configuration
ssl_protocols TLSv1.3;
ssl_prefer_server_ciphers off;
# HSTS (ngx_http_headers_module is required) (63072000 seconds)
add_header Strict-Transport-Security "max-age=63072000" always;
# OCSP stapling
ssl_stapling on;
ssl_stapling_verify on;
location / {
root /var/www/html;
index index.html index.htm;
}
}
```
Переведём новую конфигурацию в боевые настройки и проверим, что всё в порядке:
```shell
sudo ln -s /etc/nginx/sites-available/ssl /etc/nginx/sites-enabled/ssl.conf
sudo nginx -t
nginx: [warn] "ssl_stapling" ignored, issuer certificate not found for certificate "/etc/ssl/certs/nginx-selfsigned.crt"
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
```
Перезапускаем сервис `nginx`, проверяем его состояние:
```shell
sudo service nginx reload
sudo service nginx status
service nginx status
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2022-03-28 02:53:00 UTC; 21min ago
Docs: man:nginx(8)
Process: 2256 ExecReload=/usr/sbin/nginx -g daemon on; master_process on; -s reload (code=exited, status=0/SUCCESS)
Main PID: 736 (nginx)
Tasks: 3 (limit: 1107)
Memory: 13.3M
CGroup: /system.slice/nginx.service
├─ 736 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
├─2257 nginx: worker process
└─2258 nginx: worker process
```
При помощи `curl`, убедимся, что сервер работает корректно:
```shell
curl https://site.localhost --resolve 'site.localhost:127.0.0.1'
curl: (60) SSL certificate problem: self signed certificate
# проигнорируем ошибки самоподписного сертификата
curl -k https://site.localhost --resolve 'site.localhost:127.0.0.1'
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
```
4. Проверьте на TLS уязвимости произвольный сайт в интернете
```shell
git clone --depth 1 https://github.com/drwetter/testssl.sh.git
cd testssl
./testssl.sh -U --sneaky https://metagamerscore.com
Start 2022-03-28 10:31:09 -->> 217.61.246.126:443 (metagamerscore.com) <<--
rDNS (217.61.246.126): --
Service detected: HTTP
Testing vulnerabilities
Heartbleed (CVE-2014-0160) not vulnerable (OK), no heartbeat extension
CCS (CVE-2014-0224) not vulnerable (OK)
Ticketbleed (CVE-2016-9244), experiment. not vulnerable (OK)
ROBOT Server does not support any cipher suites that use RSA key transport
Secure Renegotiation (RFC 5746) supported (OK)
Secure Client-Initiated Renegotiation not vulnerable (OK)
CRIME, TLS (CVE-2012-4929) not vulnerable (OK)
BREACH (CVE-2013-3587) potentially NOT ok, "gzip" HTTP compression detected. - only supplied "/" tested
Can be ignored for static pages or if no secrets in the page
POODLE, SSL (CVE-2014-3566) not vulnerable (OK)
TLS_FALLBACK_SCSV (RFC 7507) No fallback possible (OK), no protocol below TLS 1.2 offered
SWEET32 (CVE-2016-2183, CVE-2016-6329) not vulnerable (OK)
FREAK (CVE-2015-0204) not vulnerable (OK)
DROWN (CVE-2016-0800, CVE-2016-0703) not vulnerable on this host and port (OK)
make sure you don't use this certificate elsewhere with SSLv2 enabled services
https://censys.io/ipv4?q=DA0C37574C249C089F819CDC857AFDD834D0ADA90888D97A0B81071AB288732E could help you to find out
LOGJAM (CVE-2015-4000), experimental not vulnerable (OK): no DH EXPORT ciphers, no DH key detected with <= TLS 1.2
BEAST (CVE-2011-3389) not vulnerable (OK), no SSL3 or TLS1
LUCKY13 (CVE-2013-0169), experimental not vulnerable (OK)
Winshock (CVE-2014-6321), experimental not vulnerable (OK)
RC4 (CVE-2013-2566, CVE-2015-2808) no RC4 ciphers detected (OK)
Done 2022-03-28 10:31:34 [ 27s] -->> 217.61.246.126:443 (metagamerscore.com) <<--
```
5. Установите на Ubuntu ssh сервер, сгенерируйте новый приватный ключ. Скопируйте свой публичный ключ на другой сервер. Подключитесь к серверу по SSH-ключу.
На виртуальной машине уже установлен ssh-сервер и настроен один ssh-ключ для подключения к машине с хоста.
Таким образом сгенерируем новый ssh-ключ для пользователя `vagrant` и попробуем подключиться как пользователь `root` через ssh-сервер.
Генерация приватного и открытого ssh-ключей:
```shell
ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/vagrant/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/vagrant/.ssh/id_rsa
Your public key has been saved in /home/vagrant/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:id08L1eU83CEIr5iolPo2NKg+J7palNIO0o7D7agGuU vagrant@vagrant
The key's randomart image is:
+---[RSA 3072]----+
| ..|
| . . .o |
| . . .= .|
| . o +. . = |
|. + .. S +. . .|
| B... o o .o . |
|*+E* o o .. o |
|B*=o* o |
|**Xo . |
+----[SHA256]-----+
```
Добавим открытый ключ в файл `authorized_keys` для пользователя `root`:
```shell
cat .ssh/id_rsa.pub | sudo tee /root/.ssh/authorized_keys
```
Проверим, что всё работает:
```shell
ssh -l root 127.0.0.1
Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.4.0-104-generic x86_64)
<...>
root@vagrant:~#
```
6. Переименуйте файлы ключей из задания 5. Настройте файл конфигурации SSH клиента, так чтобы вход на удаленный сервер осуществлялся по имени сервера.
```shell
mv ~/.ssh/id_rsa ~/.ssh/localhost_key
mv ~/.ssh/id_rsa.pub ~/.ssh/localhost_key.pub
```
Добавим новую конфигурацию в файл `~/.ssh/config`:
```
host local-root
hostname 127.0.0.1
user root
identityfile ~/.ssh/localhost_key
```
Проверим, что всё работает:
```shell
ssh local-root
Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.4.0-104-generic x86_64)
<...>
root@vagrant:~#
```
7. Соберите дамп трафика утилитой tcpdump в формате pcap, 100 пакетов. Откройте файл pcap в Wireshark.
```shell
sudo tcpdump -c 100 -w dump.pcap
tcpdump -r dump.pcap
reading from file dump.pcap, link-type EN10MB (Ethernet)
<...>
```
Для просмотра полученного файла в `Wireshark`, установим утилиту на хосте:
```shell
sudo apt install wireshark
```
Теперь, скопируем файл из виртуальной машины на хост, чтобы была возможность открыть его без проблем:
```shell
scp -P 2222 vagrant@127.0.0.1:/home/vagrant/dump.pcap ./dump.pcap
```
Затем запустим графическое отображение утилиты и откроем в ней файл:
![wireshark](wireshark.png)

Binary file not shown.

After

Width:  |  Height:  |  Size: 493 KiB

View File

@@ -0,0 +1,119 @@
# Linux operating system
## Streams
Базовые потоки:
* `0` - stdin (`/proc/<pid>/fd/0`)
* `1` - stdout (`/proc/<pid>/fd/1`)
* `2` - stderr (`/proc/<pid>/fd/2`)
Для перенаправления потока можно использовать `X>&Y`, где `X` поток, который нужно перенаправить,
`Y` - поток, в который нужно направить данные (может быть стандартным файлом).
## Kernel
Версия ядра: `uname -r`.
Версия дистрибутива: `cat /etc/issue` (debian-based), `cat /etc/redhat-release` (centos-based).
Посмотреть всю конфигурацию системы: `sysctl -a`.
Логи системы: `dmesg`, `syslog`.
## Systemctl
* `systemctl list-units --all`
* `systemctl status <service>`
* `systemctl cat <service>` - просмотреть файл настроек сервиса
* `systemctl list-dependencies <service>`
```shell
systemctl list-dependencies docker
docker.service
● ├─containerd.service
● ├─docker.socket
● ├─system.slice
● ├─network-online.target
● │ └─NetworkManager-wait-online.service
● └─sysinit.target
● ├─apparmor.service
<...>
```
* `journalctl -f`
* `journalctl -f -u docker`
## Filesystems
* `stat <file>`
### File types
* regular file (`ls -la` - `-`)
* directory (`ls -la` - `d`)
* hardlink (`ls -la` - `l`)
1 файл - 1 hardlink
1 директрория - минимум 2 hardlink (у пустой директории - 2, +1 за каждую директорию внутри)
* symlink (`ls -la` - `l`)
* pipe (`ls -la` - `p`)
Перенаправление потоков, только однонаправленный
`mkfifo <pipe>`
* socket (`ls -la` - `s`)
Двунаправленный поток, производительнее, чем pipe. Используется для взаимодействия между процессами.
### File access
`chown`, `chmod`, `umask`
Права по умолчанию:
* `file`: `666 - umask`
* `dir`: `777 - umask`
Дополнительные права доступа:
* `sticky` - создание доступно всем, удаление только файлы пользователя
* `setuid`
* `setgid`
`lsattr`/`chattr`
### Raid
`mdadm`
### LVM
`lvs`, `vgs`, `vgdisplay`, `pvdisplay`
### Partitions
`fdisk -l`/`fdisk`, `sfdisk`
### Filesystems
`mkfs`, `mount`, `/etc/fstab`
## Network
* `ping <domain/ip>`
* `whois <ip>`
* `whois -h whois.radb.net <ip>`
* `bgpq3 -J <AS>`
* `traceroute -An <ip>`
* `mtr -zn <ip>`
* `dig +trace @8.8.8.8 <domain>`
* `dig -x <ip>`
* `telnet <domain/ip> <port>`
* `ipcalc <network ip>/<mask>`
### SSH
* `ssh-copy-id user@server` - добавление ssh-ключа на сервер для пользователя
* `ssh-keygen -F server` - проверка ssh-сертификатов сервера
* `ssh-keygen -R server` - удаление записи сервера из `known_hosts`
### Web-servers
* ssl config generation: https://ssl-config.mozilla.org/