# Базовые рекомендации по безопасности

{% hint style="warning" %}
По-умолчанию система поставляется в конфигурации с минимальным уровнем безопасности, для масимально быстрой установки и тестирования любым пользователем. Поэтому, после окончания тестовой эксплуатации, администратору необходимо самостоятельно обеспечить уровень безопасности системы, подходящий для эксплуатации в production режиме. Ниже мы предоставили список рекомендаций, который вы можете использовать.
{% endhint %}

## Смена паролей пользователей root и установка сложного пароля для БД

При установке системы в среде Linux, в установочном скрипте предлагается сбросить и заменить пароль root и создать пароль для пользователе БД (mySQL или MariaDB). Рекомендуется задавать сложные пароли.

При установке системы на Windows, используется пароль пользователя root по-умолчанию и он равен имени пользователя root, и для обеспечения безопасности его рекомендуется поменять на сложный пароль.

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

## Смена паролей пользователей в веб-интерфейсе vsDesk

После установки системы, для авторизации использованы максимально простые пароли, поэтому рекомендуется выполнить смену паролей, особенно для учетной записи администратора системы.

## Восстановление пароля администратора системы

В системе не предуссмотрено механизма восстановления пароля администратора через веб-интерфейс. Если вы забыли пароль администратора и в системе нет других административных учетных записей, восстановить пароль можно только через запрос к БД. Для этого в консоли сервера необходимо выполнить подключение к БД с учетной записью root&#x20;

```bash
mysql -u root -p
```

После успешного подключения, необходимо выбрать базу vsdesk

```sql
USE vsdesk
```

И выполнить следующий запрос, который устанавливает для учетной записи admin пароль admin:

```sql
UPDATE `CUsers` SET Password = "b147fdcfe0a8120780ce85a8a6d27596" WHERE `Username` = "admin";
```

## Ограничение / разрешение доступа к обновлению системы

По-умолчанию в системе реализован механизм ограничения доступа к обновлению через веб-интерфейс. В зависимости от версии ПО или ОС сервера в файле .htaccess находящемся в корне установленной системы по пути:

```
Linux: /var/www/vsdesk
Windows: C:\vsDesk\domains\localhost
```

Для огрничения доступа к скрипту обновления используется директива, которая ограничивает доступ к обнолению только с локального сервера, на котором установлена система (актуально для WIndows), где IP адрес (127.0.0.1) это адрес ПК с которого администратор может выполнять обновление, или же это может быть подсеть, например *192.168.0.0/24*

```apacheconf
<Files "update.php">
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1
</Files>
```

{% hint style="warning" %}
В зависимости от версии ПО данная директива может быть прописана или не прописана и ее необходимо добавить вручную, чтобы обезопасить систему от воздействия извне.
{% endhint %}

## Ограничение загрузки исполняемых файлов

Ограничение загрузки исполняемых файлов позволяет защитить систему от загрузки на сервер и запуска вредоностных скриптов или попыток взлома системы. По-умолчанию реализовано через директивы .htaccess расположенные в папках куда загружаются вложения и аватары пользователей **uploads**, **media** и подпапках, а так же в папке **protected/\_backup** для резервных копи&#x439;**.** По-умолчанию прописан запрет на загрузку только исполняемых скриптов php и js, но мы рекомендуем прописать необходимые для вашего уровня безопасности расширения файлов, которые могут быть использованы злоумышленниками.

```apacheconf
<Files "*.php">
    deny from all
</Files>
<Files "*.js">
    deny from all
</Files>p
```

## Использование SSL сертификатов и HTTPS протокола

Для **production** режима рекомендуется настроить систему на работу по HTTPS протоколу и получить валидные SSL-сертификаты. Это так же необходимо для работы большинства интеграций с внешними системами.

{% hint style="info" %}
Для использования рекомендуем получить SSL сертификат выданный на имя хоста, на котором размещен ваш сервер. Вы можете получить его платно у любого провайдера или использовать бесплатный Let\`s Encrypt
{% endhint %}

### Подключение SSL сертификата в Windows&#x20;

{% hint style="warning" %}
Важно! Установка проводится без изменения существующих настроек, только путём добавления новых записей.&#x20;
{% endhint %}

По  пути: C:\vsDesk\userdata\config\ есть папка "cert\_files", (там лежат дефолтные файлы server.crt и server.key).  Рядом создаём папку, например "cert\_files\_for\_me". В ней будут хранится наши сертификаты и ключи. Если у нас несколько доменов, копируем в эту папку все сертификаты и ключи, купленные или созданные бесплатно. Переименовываем, чтобы не запутаться. Рекомендуется называть файлы по названиям доменов, легче управлять. Например site1.crt, site1.key, site2.crt, site2.key, site3.crt, site3.key.

Потом открываем конфигурационные файлы того модуля, который у вас в настройках: например (это для примера): Зелёный флажок ->Дополнительно ->конфигурация ->Apache-PHP-8 ( или Nginx или Apache 2.4) откроется два конфигурационных файла. Один закроем, а в файле vhost.conf (именно в vhost.conf) в блоке

```
#-----------------------------------------------# # Начало блока конфигурации HTTPS хоста #-----------------------------------------------#
```

находим строки&#x20;

```apacheconf
SSLCertificateFile "%sprogdir%/userdata/config/cert_files/server.crt"
SSLCertificateKeyFile "%sprogdir%/userdata/config/cert_files/server.key"
```

и прописываем дополнительно под имеющимися указывая путь к папке с сертификатами - (вместо cert\_files вписываем cert\_files\_for\_me), заменяем названия crt и key на наши и получает вот так:

```apacheconf
SSLCertificateFile "%sprogdir%/userdata/config/cert_files_for_me/server.crt" 
SSLCertificateKeyFile "%sprogdir%/userdata/config/cert_files_for_me/server.key"
SSLCertificateChainFile "%sprogdir%/userdata/config/cert_files_for_me/intermediate.crt"
```

{% hint style="danger" %}
Не забывайте про важность установки цепочки сертификатов (SSLCertificateChainFile)
{% endhint %}

Обязательно перезапускаем OSP. Всё начинает работать после перезапуска OpenServer Panel

Больше информации на <https://ospanel.io/docs/> и <https://ospanel.io/forum/>

### Подключение SSL сертификата в Linux

Если устанавливаете сертификаты Let\`s Encrypt прямо с сервера, то скрипт сделает все за вас, ниже описана процедура подключения купленных сертификатов.&#x20;

Скопируем ваши сертификаты в /etc/ssl и назначим файлу ключа права чтения только администратору:

```bash
sudo cp server.pem /etc/ssl/certs/
sudo cp server.key /etc/ssl/private/
sudo cp intermediate.crt /etc/ssl/private/
sudo chmod 0600 /etc/ssl/private/server.key
sudo chmod 0600 /etc/ssl/private/intermediate.crt 
```

## Настройка Apache

Для начала необходимо активировать `mod_ssl`:

```bash
sudo a2enmod ssl
```

А затем включить настройки HTTPS сайта по умолчанию:

```bash
sudo a2ensite default-ssl
```

Теперь необходимо отредактировать файл с настройками HTTPS сайта по умолчанию, указав в нём пути к вашим сертификатам. Сам файл называется `/etc/apache2/sites-enabled/default-ssl` (или `/etc/apache2/sites-enabled/default-ssl.conf`).

В этом файле рекомендуется после директивы

```apacheconf
SSLEngine on
```

добавить строчку

```apacheconf
SSLProtocol all -SSLv2
```

дабы запретить использование устаревшего протокола SSLv2.

Дальше вам необходимо отредактировать параметры, ответственные за сертификаты.

```apacheconf
# Публичный сертификат сервера
SSLCertificateFile    /etc/ssl/certs/server.pem
# Приватный ключ сервера
SSLCertificateKeyFile /etc/ssl/private/server.key
# Цепочка сертификатов
SSLCertificateChainFile /etc/ssl/private/intermediate.crt
```

Теперь просто перезагрузите Apache:

```bash
sudo service apache2 restart
```

И если все параметры указаны верно, ваши сайты станут доступны по HTTPS.

Протокол HTTPS работает по 443 порту, поэтому если сервер находится за шлюзом, то необходимо на нём пробросить данный порт.

### Перенаправление HTTP запросов на HTTPS

Если вы хотите запретить использование HTTP, то самым разумным будет перенаправлять все HTTP запросы к страницам на их HTTPS адрес. Сделаем это с помощью `mod_alias`. Если он не включён — включаем:

```bash
sudo a2enmod alias
sudo service apache2 restart
```

Затем изменяем файл `/etc/apache2/sites-enabled/000-default`, отвечающий за виртуальный хост по умолчанию для HTTP запросов. В этот файл добавляем директиву

```apacheconf
Redirect / https://example.com/
```

При этом все настройки директорий можно удалить, поскольку по HTTP на ваши сайты всё равно будет не попасть.

Всё, теперь ещё раз перезапустите Apache и убедитесь, что при заходе по HTTP вы автоматически перенаправляетесь на HTTPS страницу.

## Пример default-ssl файла:&#x20;

```apacheconf
<VirtualHost *:443>
        ServerAdmin webmaster@localhost
        ServerName vsdesk
        ServerAlias vsdesk.yourdomain.com
        DocumentRoot /var/www/vsdesk
       SSLEngine on
       SSLProtocol all -SSLv2
       SSLCertificateFile /etc/ssl/certs/ssl-cert-your.pem
       SSLCertificateKeyFile /etc/ssl/private/ssl-cert-yours.key
       SSLCertificateChainFile /etc/ssl/private/intermediate.crt
<Directory />
                Options FollowSymLinks
                AllowOverride All
                SSLOptions +StdEnvVars
</Directory>
<Directory /var/www/vsdesk/>
                Options Indexes FollowSymLinks MultiViews
                SSLOptions +StdEnvVars    
                AllowOverride All
                Order allow,deny
                allow from all
                SSLRequireSSL On       
</Directory>
        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/        
<Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
                SSLOptions +StdEnvVars
</Directory>
<filesmatch "\.(cgi|shtml|phtml|php)$">
    SSLOptions +StdEnvVars
</filesmatch>
        BrowserMatch ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
        ErrorLog ${APACHE_LOG_DIR}/error.log
        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn
        CustomLog ${APACHE_LOG_DIR}/access.log combined    
</VirtualHost>
```
