Bacula – пакет программ архитектуры «клиент-сервер» с открытым исходным кодом, предназначенный для создания резервных копий данных, находящихся на компьютерах с различными операционными системами, для восстановления и проверки хранящихся данных. Этот пакет имеет модульную архитектуру, легко масштабируется и может быть использован, как для небольшой локальной сети из нескольких компьютеров, так и для сети предприятия, состоящего из […]
Архивы рубрики ‘Linux/Unix General’
Настройка резервного копирования с помощью Bash-скриптов
1.Резервное копирование файлов (сайты, конфигурационные файлы)
1 |
# chown root:root /usr/local/scripts/backup-files-shell.sh |
1 |
# chmod 751 /usr/local/scripts/backup-files-shell.sh |
1 |
# nano /usr/local/scripts/backup-files-shell.sh |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
#!/bin/bash # Формат даты DATE="$(date +%Y-%m-%d)" # Каталог для хранения бекапов STORAGEDIR="/backup" # Список сайтов для копирования SITES='/home/users' # Список катадогов,исключенных из бекапа EXCLUDE1="/home/users/<user_to_exclude>" EXCLUDE2="/home/users/<username>/<sitename>/<folder_to_exclude>" #Cписок конфигурационных файлов и других служебных файлов(Nagios,Cacti,Munin) CONFIGS='/etc /usr/local/nagios /usr/lib64/nagios/plugins /usr/share/cacti /var/lib/cacti /var/www/html' # Журналируем ошибки в файл LOGFILE="/var/log/backup.log" # Как долго(кол-во дней) хранить бекапы LIMITTIME="+14" NICE="$(which nice)" IONICE="$(which ionice)" TAR="$(which tar)" FIND="$(which find)" RM="$(which rm)" ECHO="$(which echo)" [ ! -d $STORAGEDIR/sites ] && mkdir -p $STORAGEDIR/sites [ ! -d $STORAGEDIR/configs ] && mkdir -p $STORAGEDIR/configs $NICE -n 19 $IONICE -c2 -n7 $TAR -czf $STORAGEDIR/sites/sites-${DATE}.tar.gz $SITES --exclude=$EXCLUDE1 --exclude=$EXCLUDE2 exitcode=$? if [ "$exitcode" != "1" ] && [ "$exitcode" != "0" ]; then $ECHO "Backup sites is failed - $DATE" | tee -a $LOGFILE fi $NICE -n 19 $IONICE -c2 -n7 $TAR -czf $STORAGEDIR/configs/configs-${DATE}.tar.gz $CONFIGS exitcode=$? if [ "$exitcode" != "1" ] && [ "$exitcode" != "0" ]; then $ECHO "Backup configs is failed - $DATE" | tee -a $LOGFILE fi $NICE -n 19 $IONICE -c2 -n7 $TAR -cf $STORAGEDIR/backup-files-${DATE}.tar $STORAGEDIR/sites/*.tar.gz $STORAGEDIR/configs/*.tar.gz exitcode=$? if [ "$exitcode" != "1" ] && [ "$exitcode" != "0" ]; then $ECHO "Tar sites and configs is failed - $DATE" | tee -a $LOGFILE else $RM -rf $STORAGEDIR/sites/* $STORAGEDIR/configs/* $ECHO "Backup Sites and Configs is done! Backup up to $DATE " | tee -a $LOGFILE fi # Удаляем бекапы старше 14 дней $FIND $STORAGEDIR -maxdepth 1 -type f -name '*.tar' -mtime $LIMITTIME -exec $RM -rf {} \; |
2.Резервное копирование баз данных
1 |
# chown root:root /usr/local/scripts/backup-databases-shell.sh |
1 |
# chmod 751 /usr/local/scripts/backup-databases-shell.sh |
1 |
# nano /usr/local/scripts/backup-databases-shell.sh |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
#!/bin/bash # Формат даты DATE="$(date +"%Y-%m-%d")" # Место хранения бекапов STORAGEDIR='/backup' # Пользователь,пароль,хост для подключения MUSER="root" MPASS="123" MHOST="localhost" # Журналируем ошибки и успешное выполнение бекапа в файл LOGFILE="/var/log/backup.log" # Как долго(кол-во дней) хранить бекапы LIMITTIME="+14" MYSQL="$(which mysql)" MYSQLDUMP="$(which mysqldump)" NICE="$(which nice)" IONICE="$(which ionice)" GZIP="$(which gzip)" TAR="$(which tar)" FIND="$(which find)" MKDIR="$(which mkdir)" ECHO="$(which echo)" RM="$(which rm)" [ ! -d $STORAGEDIR/mysql ] && $MKDIR -p $STORAGEDIR/mysql DBS="$($MYSQL -u $MUSER -h $MHOST -p$MPASS -Bse 'show databases' | egrep -v '(information_schema|performance_schema)')" for db in $DBS do FILE=$STORAGEDIR/mysql/$db-$DATE.sql.gz $MYSQLDUMP -u $MUSER -h $MHOST -p$MPASS -EKR --single-transaction $db | $GZIP -c > $FILE if [ ${PIPESTATUS[0]} != "0" ]; then $ECHO "Backup database is failed $db - $DATE" | tee -a $LOGFILE fi done cd $STORAGEDIR/mysql $NICE -n 19 $IONICE -c2 -n7 $TAR -cf $STORAGEDIR/backup-databases-${DATE}.tar *.sql.gz exitcode=$? if [ "$exitcode" != "1" ] && [ "$exitcode" != "0" ]; then $ECHO "Tar databases is failed - $DATE" | tee -a $LOGFILE else $RM -rf $STORAGEDIR/mysql/* $ECHO "Backup Databases is done! Backup up to $DATE " | tee -a $LOGFILE fi $FIND $STORAGEDIR -maxdepth 1 -type f -name '*.tar' -mtime $LIMITTIME -exec $RM -rf {} \; |
3. Резервное копирование файлов и баз данных
1 |
# chmod 751 /usr/local/scripts/backup-all-shell.sh |
1 |
# chown root:root /usr/local/scripts/backup-all-shell.sh |
1 |
# nano /usr/local/scripts/backup-all-shell.sh |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
#!/bin/bash # Формат даты DATE="$(date +%Y-%m-%d)" # Каталог для хранения бекапов STORAGEDIR="/backup" # Список сайтов для копирования SITES='/home/users' EXCLUDE1="/home/users/<user_to_exclude>" EXCLUDE2="/home/users/<username>/<sitename>/<folder_to_exclude>" #Cписок конфигурационных файлов и других служебных файлов(Nagios,Cacti,Munin) CONFIGS='/etc /usr/local/nagios /usr/lib64/nagios/plugins /usr/share/cacti /var/lib/cacti /var/www/html' # Журналируем ошибки и успешное выполнение бекапа в файл LOGFILE="/var/log/backup.log" # Как долго(кол-во дней) хранить бекапы LIMITTIME="+14" # guess binary names MYSQL="$(which mysql)" MYSQLDUMP="$(which mysqldump)" NICE="$(which nice)" IONICE="$(which ionice)" GZIP="$(which gzip)" TAR="$(which tar)" FIND="$(which find)" MKDIR="$(which mkdir)" ECHO="$(which echo)" RM="$(which rm)" # Пользователь,пароль,хост для подключения MUSER="root" MPASS="123" MHOST="localhost" [ ! -d $STORAGEDIR/sites ] && $MKDIR -p $STORAGEDIR/sites [ ! -d $STORAGEDIR/configs ] && $MKDIR -p $STORAGEDIR/configs [ ! -d $STORAGEDIR/mysql ] && $MKDIR -p $STORAGEDIR/mysql $NICE -n 19 $IONICE -c2 -n7 $TAR -czf $STORAGEDIR/sites/sites-${DATE}.tar.gz $SITES --exclude=$EXCLUDE1 --exclude=$EXCLUDE2 exitcode=$? if [ "$exitcode" != "1" ] && [ "$exitcode" != "0" ]; then $ECHO "Backup sites is failed - $DATE" | tee -a $LOGFILE fi $NICE -n 19 $IONICE -c2 -n7 $TAR -czf $STORAGEDIR/configs/configs-${DATE}.tar.gz $CONFIGS exitcode=$? if [ "$exitcode" != "1" ] && [ "$exitcode" != "0" ]; then $ECHO "Backup configs is failed - $DATE" | tee -a $LOGFILE fi DBS="$($MYSQL -u $MUSER -h $MHOST -p$MPASS -Bse 'show databases' | egrep -v '(information_schema|performance_schema)')" for db in $DBS do FILE=$STORAGEDIR/mysql/$db-${DATE}.sql.gz $MYSQLDUMP -u $MUSER -h $MHOST -p$MPASS -EKR --single-transaction $db | $GZIP -c > $FILE if [ ${PIPESTATUS[0]} != "0" ]; then $ECHO "Backup database is failed $db - $DATE" | tee -a $LOGFILE fi done $NICE -n 19 $IONICE -c2 -n7 $TAR -cf $STORAGEDIR/backup-all-${DATE}.tar $STORAGEDIR/sites/*.tar.gz $STORAGEDIR/configs/*.tar.gz $STORAGEDIR/mysql/*.sql.gz exitcode=$? if [ "$exitcode" != "1" ] && [ "$exitcode" != "0" ]; then $ECHO "Tar sites,config,databases is failed - $DATE" | tee -a $LOGFILE else $RM -rf $STORAGEDIR/sites/* $STORAGEDIR/configs/* $STORAGEDIR/mysql/* $ECHO "Backup sites,configs,databases is done! Backup up to $DATE " | tee -a $LOGFILE fi # Удаляем бекапы старше 14 дней $FIND $STORAGEDIR -maxdepth 1 -type f -name '*.tar' -mtime $LIMITTIME -exec $RM -rf {} \; |
Мониторинг лога с бекапом с помощью Monit/Nagios Monit(https://kamaok.org.ua/?p=361)
1 |
# nano /etc/monit.conf |
1 2 3 4 5 6 7 |
check file backup with path /var/log/backup.log if match 'Backup sites is failed' then alert if match 'Backup configs is failed' then alert if match 'Tar sites and configs is failed' then alert if match 'Tar sites,config,databases is failed' then alert if match 'Backup database is failed' then alert if match 'Tar databases is failed' then alert |
Nagios(https://kamaok.org.ua/?p=1487)
1 |
# nano /etc/nagios/log-files.cfg |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$seekfilesdir = '/var/tmp/check_logfiles'; # where the state information will be saved. $protocolsdir = '/tmp'; # where protocols with found patterns will be stored. $scriptpath = '/var/tmp'; # where scripts will be searched for. @searches = ( { tag => 'backup', logfile => '/var/log/backup.log', rotation => 'centos', warningpatterns => ['Backup sites is failed', 'Backup configs is failed', 'Tar sites and configs is failed', 'Tar sites,config,databases is failed', 'Backup database is failed', 'Tar databases is failed'], } ); |
4.Добавление в cron задания на ежедневный бекап
1 |
# nano /etc/cron.d/backup |
1 2 3 4 |
# Закомментируйте все за исключением того, что будет бекапить 10 4 * * * root /usr/local/scripts/backup-all-shell.sh > /dev/null 2>&1 # 10 4 * * * root /usr/local/scripts/backup-databases-shell.sh > /dev/null 2>&1 # 10 4 * * * root /usr/local/scripts/backup-files-shell.sh > /dev/null 2>&1 |
[…]
Настройка резервного копирования с помощью Rsnapshot
Rsnapshot, написанный на Perl, базируется на rsync. В рабочей директории программы (назовём так место, куда складываются бэкапы), создается ряд папок с индексом, который при каждом следующем запуске программы увеличивается до указанного в конфигурации значения. Затем устаревшая копия удаляется. Если пройти в любую из созданных папок, то внутри можно найти полную копию резервируемых данных. На это […]
Nginx — полезные мелочи (security, redirect)
Безопасность 1.Блокировка определенных User-Agents. Создаем файл с запрещенными User-Agent-ами
1 |
# nano /etc/nginx/blockuseragents.rules |
1 2 3 4 5 6 7 8 |
map $http_user_agent $blockedagent { default 0; ~*malicious 1; ~*bot 1; ~*backdoor 1; ~*crawler 1; ~*bandit 1; } |
Подключаем файл с запрещенными User-Agent-ами(вставляем перед секцией server)
1 |
include /etc/nginx/blockuseragents.rules; |
Добавляем в секцию server запрет для указанных в файле User-Agents
1 2 3 4 5 6 |
server { if ($blockedagent) { return 444; } …… } |
Либо второй вариант. Например , защита от сканеров
1 2 3 4 5 |
server { if ( $http_user_agent ~* (nmap|nikto|wikto|sf|sqlmap|bsqlbf|w3af|acunetix|havij|appscan) ) { return 444; } } |
Тестируем
1 |
# wget --user-agent "I am a bandit" http://example.com/index.html |
2.Защита от HotLink. Для конкретного location
1 2 3 4 5 6 7 8 |
location /images/ { # Или для определенных типов файлов #location ~ .(gif|png|jpe?g)$ { valid_referers none blocked example.com *.example.com; if ($invalid_referer) { return 444; } } |
3.Защита от реферального спама. […]
Установка и использование Percona XtraBackup
1.Установка Percona XtraBackup Centos
1 |
# yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm |
1 |
# yum install percona-xtrabackup |
Ubuntu Импортируем публичный GPG-ключ
1 |
# apt-key adv --keyserver keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A |
Добавляем репозитарий Percona
1 |
# echo "deb http://repo.percona.com/apt "$(lsb_release -sc)" main" | tee /etc/apt/sources.list.d/percona.list |
Проверяем,что добавился новый репозитарий
1 |
# cat /etc/apt/sources.list.d/percona.list |
1 |
deb http://repo.percona.com/apt trusty main |
Обновляем локальный кеш и устанавливаем пакет
1 |
# apt-get update && apt-get install percona-xtrabackup |
Также можно скачать конкретную версию Percona XtraBackup для требуемой операционной системы с официального сайта Percona
1 |
https://www.percona.com/downloads/XtraBackup/ |
Update: Установка XtraBackup-2.4 на Ubuntu/Debian
1 |
# wget https://repo.percona.com/apt/percona-release_0.1-4.$(lsb_release -sc)_all.deb |
1 |
# dpkg -i percona-release_0.1-4.xenial_all.deb |
1 |
# apt-get update |
1 |
# apt-get install percona-xtrabackup-24 |
[…]
Установка и использование Percona Toolkit
Установка Percona Toolkit Debian/Ubuntu
1 |
# wget https://repo.percona.com/apt/percona-release_0.1-4.$(lsb_release -sc)_all.deb |
1 |
# dpkg -i percona-release_0.1-4.$(lsb_release -sc)_all.deb |
1 |
# apt-get update |
1 |
# apt-get install percona-toolkit |
Centos
1 |
# yum install perl-IO-Socket-SSL perl-Digest-MD5 perl-TermReadKey |
1 |
# yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm |
1 |
# yum install percona-toolkit |
1 |
pt-variable-advisor |
Анализ переменных MySQL(на основе SHOW VARIABLES) и вывод рекомендаций
1 |
# pt-variable-advisor localhost |
1 |
pt-query-digest |
Анализ slow-log,списка процессов(show processlist) или tcpdump 1)Отчет самых медленных запросов из файла
1 |
# pt-query-digest /var/log/mysql/mysql-slow.log |
2)Отчет самых медленных запросов из списка процессов
1 |
# pt-query-digest --processlist h=127.0.0.1 |
Либо через анализ tcpdump
1 |
# tcpdump -s 65535 -x -nn -q -tttt -i any -c 10 port 3306 > mysql.tcp.txt |
1 |
# pt-query-digest --type tcpdump mysql.tcp.txt |
1 |
pt-ioprofile |
Просмотр […]
Установка и настройка Percona XtraDB Cluster на Centos7/Ubuntu14
Разработчик продукта рекомендует использовать минимум 3 ноды для создания кластера(причины описаны в статье). С целью знакомства с этим продуктом использовалось две ноды на виртуальных машинах. 1.Установка Percona XtraDB Cluster Centos
1 |
# yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm |
Подключаем EPEL-репозитарий(если он еще не был подключен)
1 |
# rpm -Uvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm |
Устанавливаем пакет, необходимій для Percona XtraDB Cluster
1 |
# yum install socat |
Устанавливаем PXC
1 |
# yum install Percona-XtraDB-Cluster-56 |
Отклчаем SELinux, если он […]
Интеграция Fail2ban c CSF для защиты WordPress от bruteforce-атак
1. Установка, остановка и удаление с автозагрузки Fail2ban
1 |
# apt-get install fail2ban |
1 |
# service fail2ban stop |
1 |
# update-rc.d -f fail2ban remove |
2.Настройка запуска fail2ban средствами CSF
1 |
# nano /etc/csf/csfpost.sh |
1 2 |
#!/bin/sh /etc/init.d/fail2ban restart |
3.Отклчючение всех фильтров в Fail2ban
1 |
# sed -i "s|enabled = true|enabled = false|g" /etc/fail2ban/jail.conf |
4. Настройка поддержки CSF в Fail2ban
1 |
# nano /etc/fail2ban/action.d/csf-ip-deny.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[Definition] actionstart = actionstop = actioncheck = actionban = csf -d <ip> Added by Fail2Ban for <name> # curl https://www.cloudflare.com/api_json.html -d 'a=ban' -d 'tkn=<cftoken>' -d 'email=<cfuser>' -d 'key=<ip>' actionunban = csf -dr <ip> # curl https://www.cloudflare.com/api_json.html -d 'a=nul' -d 'tkn=<cftoken>' -d 'email=<cfuser>' -d 'key=<ip>' # [Init] ###### Default Cloudflare API token # cftoken = XXXXXXXXXXXXXXXXXXXXXXXXXX ###### Default Cloudflare username # cfuser = me@example.com |
Если используется Cloudflare, то расскоментируем все строки с одним знаком комментария 5.Замена для всех фильтров Fail2ban действия блокировки на созданный «csf-ip-deny»
1 |
# sed -i -e "s|banaction = |banaction = csf-ip-deny\n#banaction = |" /etc/fail2ban/jail.conf |
6. […]
Установка и настройка Duplicity для создания бекапа на Ubuntu/Centos
1.Установка Duplicity Ubuntu
1 |
# apt-get update && apt-get install duplicity |
Centos (предварительно подключаем EPEL-репозитарий)
1 |
# yum update && yum install epel-release && yum install duplicity |
Если необходимо использовать шифрование/дешифрование, то генерируем GnuPG-ключи
1 |
# gpg --gen-key |
1 2 3 4 |
(1) RSA and RSA (default) (2) DSA and Elgamal (3) DSA (sign only) (4) RSA (sign only) |
Тип ключа – вариант 1 Размер ключа – 2048 Как долго ключи будет валидны – 0(навсегда) Вводим имя и Email
1 2 |
Change (N)ame, (C)omment, (E)-mail or (O)kay/(Q)uit? o You need a Passphrase to protect your secret key. |
Если необходимо,то задаем пароль-фразу Для получения энтропии необходимой для генерации ключей в другом терминале на сервере […]
PostgreSQL — полезные команды
Внутренние команды (\команда) Помощь по внутренним командам
1 |
postgres=# \? |
Просмотр существующих баз данных
1 |
postgres=# \l |
Просмотр существующих баз данных c более детальным выводом(размер, описание баз данных)
1 |
postgres=# \l+ |
Подключение к базе данных databasename
1 |
postgres=# \c databasename; |
Просмотр существующих таблиц в текущей базе данных
1 |
postgres=# \dt |
Просмотр списка всех таблиц с описанием в текущей базе данных
1 |
postgres=# \dt+ |
Просмотр структуры, индексов […]