dd на ftp

Дата: 26.07.2019

В данной заметке расскажу о клонировании диска с помощью утилиты dd c последующим сохранением данных на ftp-хранилище. Для начала подключаемся к нашему ftp-серверу. В команде указываем адрес сервера и порт подключения.

ftp myserver.net 21

После авторизации, для сохранения образа диска на ftp нужно выполнить команду:

put "|dd if=/dev/sda" sda.dd

Для восстановления данных из образа, который расположен на ftp:

get sda.dd "|dd of=/dev/sda"

Восстановить удаленный файл в Linux

Дата: 12.07.2019

Данный метод на восстановления удаленных файлов в Linux рабочий при одном условии, во время удаления файл должен быть открыт и использоваться любым приложением. До завершения процесса восстановления файла важно не закрывать приложение или процесс, которое его использует.

Для начала посмотрим вывод программы lsof:

$ lsof | grep myfile
less      4158    root    4r      REG       3,65   114383   1276722 /home/myfile (deleted)

myfile — имя удаленного файла. Если видите такую строку, значит можно восстановить удаленный файл.
Нас интересуют данные, которые я выделил жирным шрифтом. На основе их формируем команду ниже. Результат выполнения команды должен быть следующим:

ls -l /proc/4158/fd/4
lr-x------  1 root root 64 Oct 11 17:17 /proc/4158/fd/4 -> /home/yfile (deleted)

Для восстановления файла осталось просто его скопировать:

cp /proc/4158/fd/4 /home/myfile_

Зависла команда yum

Дата: 15.06.2019Метки:

На CentOS 7 зависла команда yum. Убил все процессы, но если даже просто вызвать yum никакого вывода вообще не появлялось. Для решения проблемы нужно выполнить команд ниже. Затем проверить, что нет работающих процессов yum и rpm и повторить попытку.

rm /var/lib/rpm/__db*
rm /var/lib/rpm/.rpm.lock
rm /var/lib/rpm/.dbenv.lock

dd клонирование диска по SSH

Дата: 19.05.2019Метки:

Необходимо было сделать клон с одного диска на другой используя команду dd. На серверах абсолютно идентичные диски. Данные передаем в сжатом виде.

dd if=/dev/sda | gzip | ssh root@target 'gzip -d | dd of=/dev/sda'

В моем случае диски были по 2TB и процесс занимал несколько часов. В связи с чем имеет смысл запустить команду screen и уже потом вводить команду выше. Это нужно для того чтобы можно было закрыть окно SS-подключения.

Для отслеживания прогресса откроете еще один SSH-сеанс и введите команды из этой записи.

Установка Java 8 в Debian 8. Работающий способ.

Дата: 15.05.2019Метки:

Заметка про установку Java 8 в Debian 8. В сети полно мануалов, но помути в данный момент ни один не рабочий. Большинство из них это добавление репозитория Ubuntu — не рабочий вариант. Если вас устроить установка Java 7, то вы это можете сделать командой:

apt-get install default-jre

Ну а если нужно установить Java 8 в Debian 8, используйте следующуие команды:

wget http://javadl.sun.com/webapps/download/AutoDL?BundleId=106240 -O jre-linux.tar.gz
tar xvfz jre-linux.tar.gz
mkdir /usr/lib/jvm
mv jre1.8.0_45 /usr/lib/jvm/jre1.8.0_45
update-alternatives --install /usr/bin/java java /usr/lib/jvm/jre1.8.0_45/bin/java 1 
java -version
update-alternatives --config java

Nginx защита от DDoS

Дата: 11.04.2019Метки:

В данной заметке речь пойдет о защите веб-сервера от DDoS. Наиболее часто для нарушения работы сайта злоумышленники используют HTTP-флуд. Для защиты от HTTP-флуда я буду использовать связку из Nginx и модуля nginx-module-testcookie. Все действия производились под CentOS 7, но данная заметка будет актуальна и для других систем за исключением этапа установки пакетов.

Для начала необходимо добавить репозиторий rpms.southbridge.ru в систему. Для этого выполните команду:

rpm -Uhv http://rpms.southbridge.ru/southbridge-rhel7-stable.rpm

Далее стандартной командой устанавливаем пакеты:

yum install nginx nginx-module-testcookie

С учетом того, что Nginx я обновляю достаточно редко, по ряду причин на постоянной основе я не хочу использовать выше указанный репозиторий, то я выполню установку непосредственно из скачанных rpm-пакетов:

wget http://rpms.southbridge.ru/rhel7/stable/x86_64/nginx-1.9.5-1.el7.centos.ngx.x86_64.rpm
wget http://rpms.southbridge.ru/rhel7/stable/x86_64/nginx-module-testcookie-1.15.6.1.24-1.el7.ngx.x86_64.rpm

Если в системе ранее уже был установлен Nginx, нужно его удалить. Устанавливаем Nginx и nginx-module-testcookie:

rpm -Uhv nginx-1.15.6-1.el7.ngx.x86_64.rpm
rpm -Uhv nginx-module-testcookie-1.15.6.1.24-1.el7.ngx.x86_64.rpm

Чтобы включить модуль добавьте строку ниже в файл /etc/nginx/nginx.conf:

Для включение и отключения testcookie нам необходимо периодически просматривать статистику подключений. Для этого добавьте в конфиг:

server {
    listen 80;
    server_name localhost;

    location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        deny all;
    }
}

Применяем настройки, проверяем:

# service nginx restart
# curl http://localhost/nginx_status
Active connections: 4
server accepts handled requests
 137 137 190
Reading: 0 Writing: 1 Waiting: 3

Берем файл https://github.com/duy13/vDDoS-Protection/blob/master/aes.min.js.txt и копируем его в отдельный каталог на сервере /www/public_html/aes.min.js

Добавляем в конфиг вашего сайта следующие строки:

location = /aes.min.js {
    gzip on;
    gzip_min_length 1000;
    gzip_types text/plain;
    gzip_static on;
    root /www/public_html;
}

Сохраняем настройки:

nginx reload

Проверяем, что файл доступен по адресу http://site.ru/aes.min.js

Добавляем в конфиг вашего сайта параметры по примеру ниже:

http {
    testcookie off;
    testcookie_name RCPC;
    testcookie_secret nlos7m5hYc6gNmm7NvhCZJ8W7lJHuAaV2dp73px9diYMYzKmhvrpjZLNaoK989wW;
    testcookie_session $remote_addr;
    testcookie_arg attempt;
    testcookie_max_attempts 3;
    testcookie_get_only on;
    testcookie_redirect_via_refresh on;
    testcookie_refresh_encrypt_cookie on;
    testcookie_refresh_encrypt_cookie_key ea5891045bdfddd19682146f1e88e6e8;
    testcookie_refresh_encrypt_cookie_iv ea5891045bdfddd19682146f1e88e6e8;
    testcookie_refresh_template '<html><body>setting cookie...<script type=\"text/javascript\" src=\"/aes.min.js\" ></script><script>function toNumbers(d){var e=[];d.replace(/(..)/g,function(d){e.push(parseInt(d,16))});return e}function toHex(){for(var d=[],d=1==arguments.length&&arguments[0].constructor==Array?arguments[0]:arguments,e="",f=0;f<d.length;f++)e+=(16>d[f]?"0":"")+d[f].toString(16);return e.toLowerCase()}var a=toNumbers("$testcookie_enc_key"),b=toNumbers("$testcookie_enc_iv"),c=toNumbers("$testcookie_enc_set");document.cookie="RCPC="+toHex(slowAES.decrypt(c,2,a,b))+"; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/";document.location.href="$testcookie_nexturl";</script></body></html>';



 server {
        listen 80;
        server_name test.com;

        location = /aes.min.js {
            gzip on;
            gzip_min_length 1000;
            gzip_types text/plain;
            root /var/www/public_html;
        }
        
        #Если используется проксирование, в противном случае не использовать
        location / {
            testcookie off;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_pass http://127.0.0.1:80;
        }
    }

Параметр testcookie_secret заполняем случайным набором из 64 символов. Для testcookie_refresh_encrypt_cookie_key и testcookie_refresh_encrypt_cookie_iv генерируем hex число длиной 32 символа этим генератором.

Теперь осталось настроить скрипт, который будет автоматически проверять количество подключений к Nginx и в случае превышения лимита, автоматически включать testcookie и атпровлять уведомление администратору на почту.

#!/bin/sh

NGINX_CONF=/etc/nginx/conf.d/default.conf
MAIL="admin@site.ru"
MAILTO=root
LA_ACTIVATE=17
LA_DEACTIVATE=5
NGINX_CONNECT=1000

TMPLOG=/tmp/testcookie_module.tmp
NGINXCONN=`curl -s http://localhost/nginx-status | grep "Active" | awk '{print($3)}'`
LA=`cat /proc/loadavg | awk -F '.' '{print($1)}'`

function e {
    echo -en $(date "+%F %T"): "$1"
}

if [ ! -f $TMPLOG ];then echo 0 > $TMPLOG; fi
LASTRESULT=`cat $TMPLOG`

if [ -n "$NGINXCONN" ]; then
  if [ $NGINXCONN -gt $NGINX_CONNECT ]; then
    ALERT1="1"
  fi
fi

if [ -n "$LA" ]; then
  if [ $LA -gt $LA_ACTIVATE ]; then
    ALERT2="1"
  fi
fi

ALERT=$ALERT1$ALERT2

if [ -n "$ALERT" -a $LASTRESULT -eq 0 ]; then
    e; printf "Nginx connect: %-4s LA: %-3s | Activate testcookie\n" "$NGINXCONN" "$LA"
    sed -i 's/.*##-AUTO-DDOS-LABEL-##/\ttestcookie on; ##-AUTO-DDOS-LABEL-##/g' $NGINX_CONF
    /sbin/service nginx reload >/dev/null 2>&1
    echo 1 > $TMPLOG
    if [ "$MAIL" = "true" ];then
        echo "Nginx connect $NGINXCONN, LA $LA. Nginx test-cookie enable" | mail -s "`hostname` DDOS detected. Nginx test-cookie enable" $MAILTO
    fi
fi

if [ $LA -le $LA_DEACTIVATE -a $LASTRESULT -eq 1 ]; then
    e; printf "Nginx connect: %-4s LA: %-3s | Dectivate testcookie\n" "$NGINXCONN" "$LA"
    sed -i 's/.*##-AUTO-DDOS-LABEL-##/\ttestcookie off; ##-AUTO-DDOS-LABEL-##/g' $NGINX_CONF
    /sbin/service nginx reload >/dev/null 2>&1
    echo 0 > $TMPLOG
fi

Добавляем задание в cron:

* * * * *      /etc/nginx/check.sh >/dev/null 2>&1

Отключить обновления Windows 10

Дата: 11.04.2019Метки:

Начнем с того, что отключать обновления для Windows строго не рекомендуется. Но случаются ситуации, когда необходим максимальный аптайм и данное действие просто необходимо сделать. Как показывает практика, отключение службы обновлений Windows не дает гарантии прекращения автоматической загрузки и установки обновлений. Через некоторое время, вы можете обнаружить, что система была автоматически перезагружена по причине установки обновлений.

В данной заметке поделюсь проверенным на данный момент способом. Выполните в командной строке с правами администратора команду:

takeown /f c:\windows\system32\usoclient.exe /a

далее переходим в каталог C:\Windows\System32\, найдите usoclient.exe, нажмите по нему правой кнопкой мыши и выберите пункт Свойства. Поочередно выберите каждый пункт в списке Группы или пользователи и снимите для них все разрешения.

Warning: require(): open_basedir restriction in effect. File(x) is not within the allowed path(s)

Столкнулся с ошибкой во время переноса скрипта на другой сервер. Для управления сайтами используется панель Vesta CP. Проблема заключается в том, что на сервере не правильно прописана опция open_basedir. Для нормальной работы скрипта нам нужно обеспечить доступ к каталогу /home/system/web/system.ru/yii/.

Warning: require(): open_basedir restriction in effect. File(/home/system/web/system.ru/yii/vendor/autoload.php) is not within the allowed path(s): (/home/system/web/system.ru/public_html:/home/system/1) in /home/system/web/system.ru/public_html/admin/index.php on line 10

Warning: require(/home/system/web/system.ru/yii/vendor/autoload.php): failed to open stream: Operation not permitted in /home/system/web/system.ru/public_html/admin/index.php on line 10

Fatal error: require(): Failed opening required '/home/system/web/system.ru/public_html/admin/../../yii/vendor/autoload.php' (include_path='.:/usr/share/pear:/usr/share/php') in /home/system/web/system.ru/public_html/admin/index.php on line 10

Для решения проблемы Warning: require(): open_basedir restriction in effect. File(x) is not within the allowed path(s) переходим в каталог с конфигами Apache. У меня Vesta CP и они расположены по следующему пути:

cd /home/system/conf/web

Далее добавляем или правим настройки в конфигах:

system.ru.httpd.conf
system.ru.httpd.ssl.conf

Следующую опцию:

<Directory /home/system/web/system.ru/public_html>
        AllowOverride All
        SSLRequireSSL
        Options +Includes -Indexes +ExecCGI
        php_admin_value open_basedir   /home/system/web/system.ru/public_html:/home/system
        php_admin_value upload_tmp_dir /home/system/tmp
        php_admin_value session.save_path /home/system/tmp
    </Directory>

Поиск и замена в Linux

Дата: 03.04.2019

Допустим у вас есть сервер, на котором нужно изменить ip-адрес. Проблема в том, что есть много конфигов, где может быть указан этот адрес. Но у вас нет времени и желания лазить по всем конфигам и прописывать новые настройки. Данную задачу можно автоматизировать и ускорить если выполнить поиск по содержимому всех файлов в Linux c последующей заменой необходимого фрагмента текста на свое значение.

Для поиска и замены в Linux по указанному слову выполните команду:

grep -rli 'исходный текст' * | xargs -i@ sed -i 's/исходный текст/текст на который нужно заменить/g' @

Если нужно просто выполнить поиск по содержимому файлов без выполнения замены:

grep -rl 'исходный текст' /

Монтирование NTFS в Linux

Дата: 29.03.2019

Небольшая заметка на тему монтирования NTFS в Linux. Понадобилось мне скопировать файлы с диска, на котором была ранее установлена Windows. Монтирую как обычный раздел и получаю следующее сообщение:

# mount /dev/sda2 /1
The disk contains an unclean file system (0, 0).
The file system wasn't safely closed on Windows. Fixing.

Данное сообщение связано с некорректным завершением работы, что по сути совсем не важно, мне просто нужно забрать файлы и нет возможности снова подключить диск для корректного завершения работы.