GNU/Linux | Notes
رفتن به کانال در Telegram
Open Source, GNU/Linux, Debian/Ubuntu, Dotfiles, Software, Scripts, Notes, Terminal, Shell, Tools, Games, Fun, Misc, Music, Geek, Free Software Movement. Почта: krekhov.dev@gmail.com Кто я: https://t.me/krxnotes/246 GitHub: https://github.com/krekhovx
نمایش بیشتر2 233
مشترکین
اطلاعاتی وجود ندارد24 ساعت
-27 روز
-330 روز
آرشیو پست ها
2 236
Компоненты ядра операционной системы Linux (коротко).
1. Process Scheduler (SCHED)
Планировщик процессов, отвечает за контроль над доступом процессов к CPU. Обеспечивает такое поведение ядра, при котором все процессы имеют справедливый доступ к центральному процессору.
2. Memory Manager (MM)
Менеджер памяти, обеспечивает различным процессам безопасный доступ к основной памяти системы. Кроме того, MM обеспечивает работу виртуальной памяти, которая позволяет процессам использовать больше памяти, чем реально доступно в системе. Выделенная, но неиспользуемая память вытесняется на файловую систему, и при необходимости - возвращается из неё обратно в память (swapping).
3. Virtual File System (VFS)
Уровень абстракции поверх конкретной реализации файловой системы. Целью VFS является обеспечение единообразного доступа клиентских приложений к различным типам файловых систем.
4. Network Interface (NET)
Сетевые интерфейсы, обеспечивает работу с различными сетевыми стандартами и сетевым оборудованием.
5. Inter-Process Communication (IPC)
Межпроцессное взаимодействие, обмен данными между потоками одного или разных процессов, реализуется посредством механизмов, предоставляемых ядром OC или процессом.
———
@krxnotes
2 236
exec и tee
С помощью exec можно делать замену дескрипторов/процессов.
tee читает из своего stdin и пишет в stdout например, сценарий
script.sh:
#!/bin/bash
exec 2> >(tee file.log)
sleep .1
>&1 echo "hello 1"
>&2 echo "hello 2"
Затем выполнить:
$ ./script.sh
Разбор. Здесь два процесса, первый наш исполняемый script.sh, а второй это tee. У первого процесса stderr (2 файловый дескриптор) смотрит в pipe, у второго процесса stdin (1 файловый дескриптор) смотрит тоже в этот pipe, то есть весь stderr сценария будет перенаправляться в tee, который будет записывать это в файл file.log.
Часто с tee командами возникает (freeze shell) tee останавливает появления приглашения PS1, который ожидает EOF в своем stdin, в качестве обходного пути можно сделать sleep .1 как в примере выше.
Перенаправить stdout и stderr в file.txt:
exec &> >(tee file.txt)
Перенаправить stdout в file.txt:
exec 1> >(tee file.txt)
Перенаправить stderr в file.txt:
exec 2> >(tee file.txt)
Для заметки:
&> и >& одинаковы
2>&1 перенаправляет stderr в stdout
>/dev/null перенаправляет только stdoutДругой пример, сценарий
main.sh:
#!/bin/bash
>&1 echo "hello 1"
>&2 echo "hello 2"
Трюки без exec, а с tee:
$ ./main.sh 2>&1 | tee logs/file.log
$ ./main.sh 2> >(tee logs/stderr.log)
———
@krxnotes2 236
Мне все понятно, скрипт-киддикам дали поиграться: https://www.vedomosti.ru/technology/news/2024/03/20/1026915-proukrainskie-hakeri
Заключительный пост к прошлым двум постам.
———
@krxnotes
2 236
Атака на SSH сервер. Как пользоваться fail2ban. Разбор лога.
Я арендую сервер для своих рабочих нужд у компании reg.ru, я им доверяю. Я слежу за безопасностью ПО на сервере, анализирую логи, принимаю определенные меры безопасности. Недавно я посмотрел вывод команды:
$ journalctl -S today
и увидел там много веселого! (смотреть скриншот в следующем посте), эти строки показывают сообщения об ошибках, связанных с попытками подключения по SSH к моему серверу (они повторяются много раз). Я думаю будет полезно разобрать данную ситуацию, ибо в последнее время активно атакуются Российские IT компании со стороны США, Украины. Не буду томить, здесь простейший перебор на дурачка, перебираются часто встречающиеся пользователи, пароли, чтобы получить доступ к системе, попытка взломать сервер, как я это понял ? Журнал /var/log/auth.log очень резко стал расти в объеме это раз, во-вторых, в журнале видно, что PAM кричит о неудачных попытках входа по SSH от имени различных пользователей (которых нет у меня на сервере) - это обычный перебор.
Объяснение ошибок:
kex_protocol_error:
Указывает на ошибки в процессе обмена ключами (key exchange) на этапе предварительной аутентификации. Это может быть связано с несовместимостью протоколов или ошибками в передаче данных.
kex_exchange_identification:
Клиент отправил неверный идентификатор протокола. В данном случае клиент попытался подключиться к SSH-серверу, используя запрос HTTP, что является некорректным. Сообщение kex_exchange_identification: banner line contains invalid characters указывает на то, что строка баннера, отправленная клиентом, содержит недопустимые символы.
MaxStartups throttling:
Сервер достиг предела по количеству одновременных незавершенных попыток подключения (MaxStartups). Это механизм защиты от DoS-атак, который ограничивает количество параллельных подключений.
Возможные причины:
- Попытки несанкционированного доступа или автоматизированные сканирования (боты, пытающиеся найти уязвимости).
- Несовместимость протоколов между клиентом и сервером.
- Ошибки конфигурации клиента или сервера SSH.
Рекомендации:
1. Проверка конфигурации:
- Убедитесь, что конфигурация SSH-сервера корректна и соответствует требованиям безопасности.
2. Журналирование и мониторинг:
- Продолжайте мониторинг логов для выявления подозрительной активности.
3. Ограничение доступа:
- Ограничьте доступ к SSH по IP-адресам, если возможно.
- Используйте firewall для блокировки подозрительных IP-адресов.
4. Обновление программного обеспечения:
- Убедитесь, что ваш SSH-сервер и клиент обновлены до последних версий.
5. Использование fail2ban:
- Рассмотрите возможность использования fail2ban или аналогичных инструментов для автоматической блокировки IP адресов, совершающих подозрительные попытки подключения.
Действия:
При конфигурации /etc/ssh/sshd_config я всегда касаюсь одних и тех же строк, ничего нового не придумываю, правило одно - это никаких паролей, вход только по ключам, пароли входа запретить (ибо их можно перебрать), как для пользователей, так и для root, вот основные моменты:
... PermitRootLogin prohibit-password PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys PasswordAuthentication no PermitEmptyPasswords no ClientAliveInterval 120 ...Установка fail2ban сервиса:
$ sudo apt-get install -y fail2ban
Добавить конфигурацию для sshd в /etc/fail2ban/jail.local файл:
[sshd] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 3 bantime = 86400Перезапустить:
$ sudo systemctl restart fail2ban
Можно понаблюдать процесс блокировки левых IP адресов, которые обращаются к серверу по SSH (блокировка осуществляется после 3 неудачных попыток входа):
$ sudo fail2ban-client status sshd
$ sudo tail -f /var/log/fail2ban.log
Если на вашем сервере работают другие службы, рассмотрите возможность настройки fail2ban для их защиты.
———
@krxnotes2 236
pushd / popd / dirs
Показывают всю красоту стека и его логику, например:
$ pushd ~/main
$ pushd ~/main/notes
$ dirs
~/main/work ~/main ~
$ popd
~/main ~
———
@krxnotes2 236
Как перевести скрипт в бинарный формат (ELF) ?
Создадим сценарий:
$ echo -e '#!/bin/sh\necho hello\nexit 0' > hello.sh
Установка:
$ sudo apt-get install -y shc
Перевести скрипт в ELF файл:
$ shc -f hello.sh
$ ./hello.sh.x
hello
Удостовериться, что наш сценарий-программа действительно ELF:
$ file hello.sh.x
hello.sh.x: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=0d5954d51e07ffc91fce25485256ef210af3dbcc, for GNU/Linux 3.2.0, stripped
hello.sh.x аналогичен a.out файлу, получился ELF. shc отличный инструмент, чтобы скрыть скрипт в бинарном файле.
———
@krxnotes2 236
Бинарные модули и процессы.
Бинарные модули - это программы, которые уже скомпилированы и хранятся в готовом к выполнению формате для конкретной операционной системы и аппаратной архитектуры. Они ожидают своего запуска, находясь в состоянии пассивного ожидания (на диске).
Процессы - это абстракции ОС, представляющие собой данные бинарные модули в действии, загруженный двоичный код, виртуальная память, ресурсы ядра, такие как открытые файлы, связанный пользователь и т.д. Иными словами, процессы - это выполняющиеся бинарные модули (в памяти компьютера).
Основное отличие заключается в том, что бинарный модуль — это просто файл на диске, который может быть запущен, тогда как процесс — это активное выполнение этого файла в памяти с выделенными ресурсами и контекстом выполнения.
———
@krxnotes
2 236
Какие процессы бывают ?
* Пользовательские процессы (запускаются в режиме пользователя, ограниченные ресурсы).
* Процессы ядра (запускаются в режиме ядра, привилегированные процессы).
* Демоны (работают в фоне).
———
@krxnotes
2 236
+2
Если интересно как устроено мое рабочее окружение.
Мои dotfiles-debian лежат здесь. Там есть различные конфигурации инструментов, которые я использую при разработке, а это: vim, tmux, mc, mousepad, gdb, neomutt, newsboat, xfce, xfce4-terminal, dircolors, различные цветовые схемы для терминала и многое другое. Настройку окружения производит скрипт init.sh
———
@krxnotes
2 236
Как поднять себе настроение работая в оболочке ?
Я нашел два прикольных пакета в Debian, называются они
cowsay и oneko.
Можно позабавиться:
$ sudo apt-get install -y cowsay
$ cowsay "Have a good day!"
Я например добавил cowsay себе в ~/.profile и при каждом входе в оболочку вижу эту забавную надпись (смотреть скриншот).
Забавляемся дальше:
$ sudo apt-get install -y oneko
$ oneko &
За курсором будет бегать прикольный котик!
———
@krxnotes2 236
Что делает данная команда ?
Пример:
$ exec $SHELL
Переменная окружения $SHELL имеет значение текущей оболочки по-умолчанию (ее путь), в моем случае это /bin/bash. Что делает exec ? Он заменяет текущий процесс на новый, то есть заменяет текущий /bin/bash на новый /bin/bash. Таким образом, вы остаетесь в той же оболочке, но все предыдущие настройки и процессы текущей оболочки будут сброшены. Это может быть полезно для обновления или сброса окружения без необходимости открывать новый терминал. Например, мы изменили какие-то файлы окружения пользователя, допустим это /etc/bash.bashrc, чтобы не открывать новый терминал, можно просто запустить команду сброса/запуска нового /bin/bash после изменений.
———
@krxnotes2 236
Команды alias и unalias
Список всех псевдонимов:
$ alias
Удалить псевдоним:
$ unalias <my-alias>
Удалить все псевдонимы:
$ unalias -a
Если псевдонимы прописаны в .bashrc, можно сделать:
$ exec $SHELL
чтобы вернуть их после unalias команды.
———
@krxnotes2 236
Почему /bin/sh
В различных проектах часто используют не /bin/bash, а /bin/sh, почему ? Он же старый!
/bin/sh или Dash (Debian Almquist Shell) - легковесная оболочка командной строки, предназначенная для замены более тяжеловесного Bash. Она была создана для ускорения процесса загрузки и выполнения скриптов в системе. Поэтому многие дистрибутивы Linux, такие как Debian и Ubuntu, используют Dash в качестве оболочки по умолчанию.
Скрипты, написанные на /bin/sh, обычно используются для максимальной переносимости между различными Unix-подобными операционными системами. Оболочка /bin/sh представляет собой стандартную оболочку командной строки в Unix-подобных системах, которая должна быть доступна на всех таких системах.
В то время как /bin/bash (Bourne-Again Shell) является расширенной оболочкой командной строки, которая предоставляет больше функций, чем /bin/sh. Она представляет собой улучшенную версию стандартной оболочки /bin/sh, что делает ее более мощной и удобной для использования. Когда скрипт написан на /bin/sh, он чаще всего будет работать на всех Unix-подобных системах, исключая специфичные возможности, предоставляемые /bin/bash. Но если в скрипте используются уникальные функции /bin/bash, то он может не работать на системах, где /bin/bash не является стандартной оболочкой. Поэтому использование /bin/sh в некоторых проектах может быть обусловлено требованием максимальной переносимости скрипта между различными Unix-подобными системами.
———
@krxnotes
2 236
Библиотечные функции и системные вызовы.
Библиотечные функции - верхний уровень, работает в пространстве пользователя, обеспечивает более удобный интерфейс к функциям, которые выполняют работу (системным вызовам). То есть библиотечные функции обращаются к системным вызовам.
Системные вызовы - работают в привилегированном режиме от имени ядра и предоставляются самим ядром. Например, библиотечная функция printf() формирует строку, в соответствии с заданным форматом, и передает ее низкоуровневому системному вызову write(), который и выводит строку на устройство стандартного вывода.
Цепочка: Программа обращается к библиотечным функциям, находясь в пользовательском режиме. Затем библиотечная функция обращается к системным вызовам. Системные вызовы уже работают в режиме привилегированном (являются частью ядра). Затем когда системный вызов завершает работу, он возвращает управление библиотечной функции и происходит обратный переход в пользовательский режим.
Unix производит переключение из пространства пользователя в пространство ядра всякий раз, когда приложение делает системный вызов или приостанавливается аппаратным прерыванием. Например, код модуля исполняется в пространстве ядра, а обычная программа, исполняется в пространстве пользователя (прикладное ПО).
———
@krxnotes
2 236
Что такое поддержка ?
В контексте операционных систем "поддержка" обычно означает, что разработчики продолжают предоставлять обновления безопасности, исправления ошибок и иногда новые функции для определенной версии операционной системы.
Когда говорят, что поддержка для определенной версии операционной системы закончилась, это означает, что производитель перестал предоставлять обновления для этой версии. Это означает, что безопасность и стабильность операционной системы могут стать уязвимыми, так как обновления безопасности не будут выпускаться.
Например, если в CentOS 8 закончилась поддержка, это означает, что не будут выпускаться обновления безопасности и исправления ошибок для этой версии. В то время как поддержка для CentOS 7, возможно, продолжается, и обновления будут выпускаться.
Например, Debian Bullseye имеет стабильный выпуск и имеет поддержку. Обычно стабильные версии дистрибутивов длятся около 5 лет. Однако это может измениться в зависимости от решения проекта.
———
@krxnotes
2 236
Как установить скаченный шрифт ?
Например, появилось необходимость установить новый шрифт в терминале. Скачиваем шрифт из интернета (обычно с форматом .ttf), затем кладем его в
~/.fonts директорию.
Обновить кэш:
$ fc-cache -fv
Проверить доступность:
$ fc-list | grep "my new font"
Затем в настройках терминала выбрать новый шрифт.
———
@krxnotes2 236
Что такое FAQ ?
FAQ - это аббревиатура от английского выражения "Frequently Asked Questions", что в переводе на русский язык означает "Часто задаваемые вопросы". FAQ представляет собой список самых часто задаваемых вопросов и ответов на них, который обычно размещается на веб-сайте или в документации к продукту или услуге. Это помогает пользователям быстро найти ответы на свои вопросы без необходимости обращаться к службе поддержки или другим источникам информации.
———
@krxnotes
2 236
Типы файлов.
1. Обычный файл (regular file) '-'
2. Каталог (directory) 'd'
3. Именованный канал (named pipe) 'p'
4. Символическая ссылка (soft link) 'l'
5. Специальный файл устройства (device file) 'c' и 'b'
6. Сокет (socket) 's'
———
@krxnotes
2 236
Что такое fingerprint ?
При первом подключении по SSH к удаленной машине генерируется fingerprint и добавляется в файл
~/.ssh/known_hosts, наш ПК запоминает эту комбинацию и сверяет ее при каждом входе, если кто-то переустановит SSH сервер или OC, то мы об этом узнаем, потому что изменится fingerprint.
———
@krxnotes