Нынешняя версия скрипта проверена только на ОС Ubuntu 24.04 LTS.
Вероятно, скрипт будет работать и на более ранней версии Ubuntu 22.04 LTS.
Скрипт был написан для использования одним человеком и с самого начала не задумывался к публикации "для всех", поэтому код скрипта не содержит тестов, глубоких разветвлений if-else на все случаи жизни, поддержки множества операционных систем и прочего. Написать текст этого поста было и то сложнее.
Для чего этот скрипт подходит?
Скрипт подходит для быстрой ручной проверки выданного вам сервера на соответствие вашим требованиям. Лично мне это необходимо для защиты от хостеров-рукожопов, которые могут выдать неправильный конфиг сервера.
Для чего этот скрипт не подходит?
Скрипт не выдаёт оценок. Скрипт не подходит настройки чего бы то ни было, поиска бэкдоров/руткитов/буткитов, противодействия целевым атакам правительственных хакеров и тому подобного.
Примечание:
В скрипте не используется флаг -e для интерпретатора bash, поэтому скрипт не остановится при возникновении ошибки (которая может возникнуть штатно). Все ошибки пользователь должен разрешать самостоятельно: продолжить/прервать выполнение скрипта.
Любой этап проверки можно пропустить, работа скрипта может быть прервана на любом этапе. Скрипт можно запускать многократно.
Чеклист, который _выполняет пользователь_ при помощи скрипта:
✓ Проверка информации по neofetch
✓ Проверка предположительной даты установки ОС
✓ Проверка поддержки виртуализации
✓ Проверка объема оперативной памяти
✓ Проверка списка блочных устройств
✓ Проверка дисков (если на виртуальной машине данная команда выдаст ошибку - это норма)
✓ Проверка информации о внешнем IP адресе через сервис ipinfo.io (в качестве альтернативы вы можете использовать wtfismyip.com)
✓ Проверка доступности произвольного порта (по умолчанию 31337)
✓ Проверка списка открытых в настоящий момент портов
✓ Проверка списка пользователей в /etc/passwd
✓ Тестовая перезагрузка системы
Как использовать:
0. Прочитать глазами код, который вы получили от меня (анонимуса из интернетов) и планируете запускать на своём сервере
1. Сохранить код в файл на сервере, например, ~/checklist.sh
2. Установить права на исполнение файла:
Код: Выделить всё
~ $ chmod +x checklist.shКод: Выделить всё
~ $ ./checklist.shЕсли вы сохранили скрипт в /tmp и выполнили перезагрузку сервера, скрипт будет удален системой во время загрузки, как и все остальные временные файлы.
Код скрипта:
Код: Выделить всё
#!/usr/bin/env bash
fancy_echo() {
local fmt="$1"; shift
# shellcheck disable=SC2059
printf "\n$fmt\n"
}
start_item() {
local title="$1"; shift
fancy_echo "● $title\n"
}
next_item() {
fancy_echo "Press 'c' to continue or CTRL-C to interrupt"
while true; do
read -s -n 1 -r answer
if [[ "$answer" == "C" || "$answer" == "c" ]]; then
break
fi
done
}
finish() {
fancy_echo "This was the last test."
fancy_echo "Done!\n"
}
show_banner() {
fancy_echo "Ubuntu Server Checklist (c) special for DamageLiB"
next_item
}
install_deps() {
fancy_echo "Installing dependencies ..."
sudo apt update
sudo apt install -y curl neofetch python3 smartmontools
}
check_os_boot() {
start_item "Check operating system boot"
echo -n "Reboot server? [yes/no]: "
read -r answer
case "$answer" in
YES | Yes | yes)
sudo shutdown -r now
;;
NO | No | no)
fancy_echo "Skip reboot"
;;
*)
fancy_echo "Invalid answer '$answer'"
check_os_boot
;;
esac
}
check_neofetch_info() {
start_item "Check neofetch info"
neofetch
next_item
}
check_os_install_date() {
start_item "Check operating system install date"
echo "/var/log/installer created at:"
stat --format=%w /var/log/installer
next_item
}
check_listening_addresses() {
start_item "Check listening addresses"
sudo ss -tunlp
next_item
}
check_virtualization_support() {
start_item "Check virtualization support"
if grep -Eqs "svm|vmx" /proc/cpuinfo ; then
echo "Virtualization supported!"
else
echo "Virtualization is NOT supported!"
fi
next_item
}
check_memory() {
start_item "Check memory"
free -m
next_item
}
check_block_devices() {
start_item "Check block devices"
lsblk
next_item
}
check_disks() {
start_item "Check disks"
lsblk -p | grep disk | awk '{print $1}' | xargs -n1 sudo smartctl -a
next_item
}
check_ipinfo() {
start_item "Check IP address"
curl https://ipinfo.io/text
next_item
}
check_firewall_input_policy() {
local www_root="/tmp/python/www"
start_item "Check firewall INPUT policy"
echo "Press CTRL-C to stop HTTP server and continue executing the script"
mkdir -p "$www_root"
echo "ok" > "$www_root/index.html"
/usr/bin/python3 -m http.server -d "$www_root" 31337
next_item
}
check_users() {
start_item "Check users list"
grep -v -E '/bin/false|nologin' /etc/passwd
next_item
}
show_banner
install_deps
check_neofetch_info
check_os_install_date
check_virtualization_support
check_memory
check_block_devices
check_disks
check_ipinfo
check_firewall_input_policy
check_listening_addresses
check_users
check_os_boot
finish





