Compare commits

..

10 Commits

Author SHA1 Message Date
08a4112420 Заготовка для статьи про кастомизацию gitea 2025-01-26 23:44:04 +03:00
a420980165 Лого
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 2s
2025-01-25 22:50:16 +03:00
c4ce5155fe Дополнения про Fail2Ban
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 2s
2025-01-25 18:52:11 +03:00
e34afe876c Дополнительные команды
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 2s
2025-01-25 15:18:11 +03:00
b24d95ac83 Настройка Fail2Ban 2025-01-25 14:50:10 +03:00
0891a4dcc1 Пометки про ssh 2025-01-25 13:28:36 +03:00
c8d7f83fcc Пометка про перезагрузку sshd
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 1s
2025-01-24 12:29:02 +03:00
abd5f2c97a Пометка про перезагрузку 2025-01-24 12:20:31 +03:00
868dec5ab3 Правки
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 1s
2025-01-24 12:11:37 +03:00
4ef1bedad7 Настройка фаерволла c UFW 2025-01-24 11:47:40 +03:00
4 changed files with 301 additions and 6 deletions

28
docs/assets/logo.svg Normal file
View File

@@ -0,0 +1,28 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 175.000000 198.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,198.000000) scale(0.100000,-0.100000)"
fill="#ffffff" stroke="none">
<path d="M202 1689 l-92 -231 250 -620 c137 -342 262 -639 277 -661 31 -45 98
-92 153 -107 47 -13 155 -13 205 1 58 16 123 65 155 116 32 49 100 214 100
240 0 28 -153 434 -160 426 -4 -4 -42 -102 -85 -218 -42 -115 -86 -219 -96
-230 -19 -19 -19 -19 -38 0 -10 11 -40 78 -66 150 -26 72 -89 243 -140 380
-51 138 -152 412 -225 610 -73 198 -135 363 -139 367 -3 4 -48 -97 -99 -223z"/>
<path d="M783 1906 c-60 -19 -107 -51 -139 -93 -27 -36 -114 -232 -114 -259 0
-12 59 -178 130 -366 12 -32 25 -58 29 -58 4 0 43 96 86 213 43 116 85 220 95
230 16 17 17 17 37 0 14 -12 111 -262 289 -743 147 -399 271 -736 276 -750 9
-22 22 5 104 209 l93 234 -229 573 c-126 315 -241 598 -255 629 -35 79 -75
126 -137 160 -45 24 -66 29 -138 32 -52 2 -101 -2 -127 -11z"/>
<path d="M1412 1737 c-34 -94 -62 -178 -62 -185 0 -20 173 -443 179 -437 2 3
35 80 73 171 l67 165 -91 230 c-51 126 -94 229 -97 229 -3 0 -34 -78 -69 -173z"/>
<path d="M834 1116 c-35 -16 -72 -58 -80 -93 -17 -67 30 -145 99 -164 83 -22
159 29 172 116 15 101 -97 184 -191 141z"/>
<path d="M242 850 c-5 -14 -36 -90 -68 -169 -31 -79 -57 -150 -57 -156 0 -17
176 -455 183 -455 7 0 130 333 130 353 0 15 -151 402 -170 437 -7 12 -10 10
-18 -10z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

86
docs/misc/gitea.md Normal file
View File

@@ -0,0 +1,86 @@
# Кастомизация Gitea
```sh
sudo su - git
cd /var/lib/gitea/custom
```
```sh
mkdir -p /var/lib/gitea/custom/public/css
mkdir -p /var/lib/gitea/custom/templates/custom
```
```sh
sudo nano /var/lib/gitea/custom/templates/custom
```
```html
<link rel="stylesheet" href="/custom/css/custom.css">
```
```sh
sudo -u git mkdir css
sudo -u git nano css/custom.css
```
```sh
sudo systemctl restart gitea
```
```sh
sudo nano /etc/gitea/app.ini
```
https://docs.gitea.com/administration/customizing-gitea
https://docs.gitea.com/administration/config-cheat-sheet
```ini title="app.ini"
[server]
LANDING_PAGE = explore
[other]
SHOW_FOOTER_VERSION = false
SHOW_FOOTER_TEMPLATE_LOAD_TIME = false
SHOW_FOOTER_POWERED_BY = false
ENABLE_FEED = false
[i18n]
LANGS = en-US,ru-RU
NAMES = English,Русский
[repository]
DISABLE_STARS = true
[ui.meta]
AUTHOR = Artem Tishenko: Personal Git Repository Hub
DESCRIPTION = A personal hub for managing Git repositories by Artem Tishenko.
KEYWORDS = Artem Tishenko, Artyom Tishchenko, Git, self-hosted, personal projects, repositories, Gitea
```
```sh
mkdir -p /var/lib/gitea/custom/templates/base
cd /var/lib/gitea/custom/templates/base
# перейти туда
wget https://raw.githubusercontent.com/go-gitea/gitea/refs/tags/v1.22.3/templates/base/footer_content.tmpl
# remove help - https://docs.gitea.com
# remove explore - explore.repos
# remove sign_in (just visit /user/login)
wget https://github.com/go-gitea/gitea/raw/refs/tags/v1.22.3/templates/base/head_navbar.tmpl
mkdir -p /var/lib/gitea/custom/templates/repo
cd /var/lib/gitea/custom/templates/repo
# remove packages
# remove wiki
# remove repo.activity
# remove repo.issues
# remove repo.pulls
# remove watch, fork
wget https://raw.githubusercontent.com/go-gitea/gitea/refs/tags/v1.22.3/templates/repo/header.tmpl
```
```sh
# <a class="item" href="https://kb.tishenko.dev/" target="_blank">Knowledge base</a>
/var/lib/gitea/custom/templates/custom/extra_links.tmpl
```

View File

@@ -1,17 +1,18 @@
# Начальная настройка сервера # Начальная настройка сервера
## Первое подключение ## Первое подключение
Подключаемся к серверу к `root` по паролю, который должен выдываться вместе с VDS. Подключаемся к серверу к `root` по паролю, который должен выдаваться вместе с VDS.
```sh ```sh
ssh root@<IPv4> ssh root@<IPv4>
``` ```
Уже в терминале сервера выполняем. Уже в терминале сервера выполняем.
```sh { .code-wrap } ```sh { .code-wrap }
# Создаём пользователя и наделяем его правом использовать `sudo`. # Создаём пользователя и наделяем правом использовать `sudo`.
adduser <user> adduser <user>
adduser <username> sudo adduser <username> sudo
# Переключаемся на нового пользователя
su - <user> su - <user>
# Все файлы, созданные пользователем, по умолчанию будут иметь права 600, а директории - 700. # Все файлы, созданные пользователем, по умолчанию будут иметь права 600, а директории - 700.
@@ -31,10 +32,11 @@ echo "<your-id-rsa.pub>" >> .ssh/authorized_keys
ssh <user>@<IPv4> ssh <user>@<IPv4>
``` ```
Желательно обновить все пакеты. Желательно обновить все пакеты и перезагрузить сервер.
```sh ```sh
sudo apt update sudo apt update
sudo apt upgrade sudo apt upgrade
sudo reboot
``` ```
Можно придумать серверу имя, оно будет отображаться в терминале после `<user>@`. Можно придумать серверу имя, оно будет отображаться в терминале после `<user>@`.
@@ -51,13 +53,19 @@ sudo systemctl restart systemd-hostnamed
sudo nano /etc/ssh/sshd_config sudo nano /etc/ssh/sshd_config
``` ```
- `Port <ssh-port>` - можно поменять со стандртного 22 на какой-нибудь другой. Лучше больше 10000, чтобы уменьшить вероятность конфликтов с другим ПО. - `Port <ssh-port>` - можно поменять со стандартного 22 на какой-нибудь другой. Лучше больше 10000, чтобы уменьшить вероятность конфликтов с другим ПО.
- `PermitRootLogin no` - запрещаем авторизацию по SSH под `root`. - `PermitRootLogin no` - запрещаем авторизацию по SSH под `root`.
- `PasswordAuthentication no` - запрещаем авторизацию по SSH по паролю. - `PasswordAuthentication no` - запрещаем авторизацию по SSH по паролю.
После внесения изменений в конфиг, необходимо перезагрузить `sshd`.
```sh
# На некоторых системах ssh вместо sshd
sudo systemctl reload sshd
```
??? question "А что будет, если потерять SSH-ключ?" ??? question "А что будет, если потерять SSH-ключ?"
Обычно хостинг предоставляет доступ к `VNC` или другие методы подключения к серверу, которые не требуют подключения по SSH. Однако в таком случае будет необходим доступ к личному кабинету хостинга. Хостинг предоставляет доступ к `VNC` или другие методы подключения к серверу, которые не требуют подключения по SSH. Однако в таком случае будет необходим доступ к личному кабинету хостинга.
На своей машине добавляем сервер в конфиг SSH. На своей машине добавляем сервер в конфиг SSH.
@@ -75,7 +83,179 @@ Host <host>
Port <ssh-port> Port <ssh-port>
``` ```
Можно проверить, что подключение проходит без ошибок Можно проверить, что подключение проходит без ошибок.
```sh ```sh
# Если конфиг настроен
ssh <host> ssh <host>
``` ```
```sh
# Без конфига
ssh <user>@<IPv4> -p <ssh-port>
```
## Настройка фаерволла c UFW
```sh
# Установка UFW
sudo apt update
sudo apt install ufw -y
# Открываем порт, используемый для SSH (по умолчанию 22)
sudo ufw allow <ssh-port>/tcp
# Закрываем все входные
sudo ufw default deny incoming
sudo ufw default allow outgoing
# Включаем фаерволл
sudo ufw enable
# Показать состояние ufw и активные правила
sudo ufw status verbose
```
??? tip "Дополнительные команды `ufw`"
```sh
# Отключить фаерволл
sudo ufw disable
# Удалить правило (будут применены настройки по умолчанию)
sudo ufw delete allow <port>/<protocol> # удалить разрешение
sudo ufw delete deny <port>/<protocol> # удалить запрет
# Сброс всех правил
sudo ufw reset
# Вывести логи ufw
sudo tail -f -n 100 /var/log/ufw.log
# Изменить уровень логирования
sudo ufw logging <low/medium/high>
# Разрешить доступ ко всем портам с определённого IP-адреса
sudo ufw allow from <IPv4>
# Разрешить доступ к порту с определённого IP-адреса
sudo ufw allow from <IPv4> to any port <port>
```
Некоторые приложения, например `OpenSSH` или `Nginx`, добавляют пресеты с правилами для `ufw`, которые точно так же можно разрешать и запрещать.
```sh
# Вывести список пресетов
sudo ufw app list
# Открыть все соединения, которые нужны Nginx
sudo ufw allow "Nginx Full"
# Удалить правило для пресета
sudo ufw delete allow "Nginx Full"
```
## Настройка Fail2Ban
[Fail2Ban](https://github.com/fail2ban/fail2ban) - базовая защита сервера от brute-force аттак.
```sh
sudo apt update
sudo apt install fail2ban -y
sudo systemctl enable fail2ban
```
Теперь нужно [правильно настроить Fail2Ban](https://github.com/fail2ban/fail2ban/wiki/Proper-fail2ban-configuration).
```sh
# Создаём файл с пользовательскими настройками
sudo nano /etc/fail2ban/jail.local
```
Настройка защиты SSH сервера.
```ini
[sshd]
# Единственный обязательный параметр
enabled = true
# Можно не указывать, если используется стандартный порт
port = <ssh-port>
# Пример настроек. Эти параметры можно не указывать, тогда будут использованы
# значения по умолчанию.
# Если в течении 24 часов
findtime = 86400
# произведено 3 неудачных попытки логина,
maxretry = 3
# то банить IP навсегда.
bantime = -1
```
!!! tip "Более строгий конфиг для `fail2ban`"
Если на сервере настроена авторизация по ключу, можно смело использовать такой конфиг.
При авторизации по ключу, бан возможен только в случае указания неправильного имени пользователя, что исключено при использовании корректно настроенного SSH-конфига. В случае случайного бана всегда можно зайти на сервер через личный кабинет хостинга.
```ini
[sshd]
enabled = true
port = <ssh-port>
# Если произведена хотя бы одна неудачная попытка логина,
maxretry = 1
# то банить IP навсегда.
bantime = -1
```
```sh
# Применяем настройки
sudo fail2ban-client reload
```
После установки и первоначальной настройки `fail2ban` лучше перезагрузить сервер, иначе `fail2ban` может не заработать.
```sh
sudo reboot
```
??? tip "Дополнительные команды `fail2ban`"
```sh
# Вывести список активных jail's
sudo fail2ban-client status
# Вывести информацию по конкретному jail, в т. ч. список заблокированных IP
sudo fail2ban-client status <jail-name>
# Разблокировать IP
sudo fail2ban-client set <jail-name> unbanip <IP>
# Вывести логи fail2ban
sudo tail -f -n 100 /var/log/fail2ban.log
```
## Дополнительно
```sh
# Вывести записи о неудачных попытках входа в систему
sudo lastb | head -n 20
# Очистить записи о неудачных попытках входа в систему
sudo truncate -s 0 /var/log/btmp
# Показывает, кто в системе прямо сейчас
sudo w
# Логи попыток входа
sudo grep "Accepted password" /var/log/auth.log | tail -n 20
sudo grep "Failed password" /var/log/auth.log | tail -n 20
sudo grep "Invalid user" /var/log/auth.log | tail -n 20
# Очистить логи с попытками входа
sudo truncate -s 0 /var/log/auth.log
```
## Полезные ссылки
- [Initial Server Setup with Ubuntu 20.04](https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-20-04)
- [UFW Essentials: Common Firewall Rules and Commands](https://www.digitalocean.com/community/tutorials/ufw-essentials-common-firewall-rules-and-commands)
- [VPS cheatsheet](https://habr.com/ru/articles/756804/)
- [Fail2Ban](https://github.com/fail2ban/fail2ban)

View File

@@ -7,6 +7,7 @@ edit_uri: edit/main/docs/
theme: theme:
name: material name: material
language: ru language: ru
logo: assets/logo.svg
favicon: assets/favicon.ico favicon: assets/favicon.ico
icon: icon: