Сервер Apache записывает все входящие запросы и все запросы, обработанные в файл журнала. Формат журнала доступа легко настраивается. Расположение и содержание журнала доступа контролируются директивой CustomLog. Местоположение файла журнала доступа к apache по умолчанию:
RHEL / Red Hat / CentOS / Fedora Linux Расположение файла доступа Apache -
/var/log/httpd/access_log
Местоположение файла журнала доступа Debian / Ubuntu Linux Apache -
/var/log/apache2/access.log
Местоположение файла журнала доступа FreeBSD Apache -
/var/log/httpd-access.log
Чтобы найти точное местоположение файла журнала apache, вы можете использовать команду grep:
# grep CustomLog /usr/local/etc/apache22/httpd.conf
# grep CustomLog /etc/apache2/apache2.conf
# grep CustomLog /etc/httpd/conf/httpd.conf
Пример вывода:
# a CustomLog directive (see below).
#CustomLog "/var/log/httpd-access.log" common
CustomLog "/var/log/httpd-access.log" combined
Вот некоторые подробные аспекты и решения по этому вопросу (обратите внимание, что centos 6 не использует systemd, centos переключился на systemd в v7)
Настройка OpenVPN при загрузке:
Мы можем использовать systemd (для реализации службы ), чтобы запустить openvpn при загрузке, нам нужно создать службу, включить ее, а затем запустить.(после включения службы она будет автоматически запускаться во время загрузки)
1 -Создайте службу:(с корнем)
cd /etc/systemd/system
touch openvpn-custom.service
chmod 644 openvpn-custom.service
2 -Откройте служебный файл:(с правами root)
открыть /etc/systemd/system/openvpn-custom.service
в текстовом редакторе, которым вы пользуетесь примерnano openvpn-custom.service
3 -Отредактируйте и настройте служебный файл:(с помощью root)
Вставьте и адаптируйте следующий код в/etc/systemd/system/openvpn-custom.service
[Unit]
Description=OpenVPN Custom Setup Script
After=network.target network-online.target
Wants=network-online.target
[Service]
Type=forking
RemainAfterExit=yes
ExecStart=/full-path-to/your/vpn-script/vpn.sh
ExecStop=/full-path-to/a-scirpt/that-would-stop-openvpn/vpn-stop.sh
[Install]
WantedBy=multi-user.target
4 -Включить и запустить службу:(с правами root)
systemctl enable openvpn-custom.service
systemctl start openvpn-custom.service
вы можете проверить статус услуги с помощьюsystemctl status openvpn-custom.service
Настройка передачи и телеграммы при загрузке (на основе статуса openvpn):
То же, что и решение openvpn, создайте новую службу (, затем включите и запустите ее ), содержащую следующий код
[Unit]
Description=Application Depending on OpenVPN
After=network.target network-online.target openvpn-custom.service
Wants=network-online.target openvpn-custom.service
[Service]
Type=forking
RemainAfterExit=yes
ExecStart=/full-path-to/your/ovpn-applications.sh
ExecStop=/full-path-to/a-scirpt/that-would-stop-apps/ovpn-applications-stop.sh
[Install]
WantedBy=multi-user.target
Ваш ovpn -application.sh будет выглядеть примерно так
#!/bin/sh
/bin/sed s/IP_ADDRESS/$4/ /var/lib/transmission/.config/transmission/settings_template.json > /var/lib/transmission/.config/transmission/settings.json
/etc/init.d/transmission-daemon start
/etc/init.d/transmission-telegram start
After=openvpn-custom.service
и Wants=openvpn-custom.service
сделают эту службу зависимой от openvpn, и, таким образом, если служба openvpn не запущена или не работает, другая служба не запустится
Настройка OpenVPN при загрузке:
1 -Создайте службу:(с корнем)
cd /etc/rc.d/init.d
touch openvpn-custom
chmod 755 openvpn-custom
2 -Откройте служебный файл:(с правами root)
открыть /etc/rc.d/init.d/openvpn-custom
в текстовом редакторе, который вы используете примерnano openvpn-custom
3 -Отредактируйте и настройте служебный файл:(с помощью root)
#!/bin/bash
#
# chkconfig: 2345 55 45
# description: Custom openvpn script
# processname: openvpn
#
### BEGIN INIT INFO
# Provides: openvpn
# Required-Start: $network
# Required-Stop: $network
# Default-Start: 2 3 4 5
# Short-Description: The openvpn daemon
# Description: The openvpn daemon custom script
### END INIT INFO
#/etc/rc.d/init.d/openvpn-custom
# Source function library.
. /etc/init.d/functions
start() {
echo -n "Starting custom openvpn... "
/full-path-to/your/vpn-script/vpn.sh
return 0
}
stop() {
echo -n "Shutting down custom openvpn... "
/full-path-to/a-scirpt/that-would-stop-openvpn/vpn-stop.sh
return 0
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
;;
restart)
stop
start
;;
reload)
;;
*)
echo "Usage: openvpn-custom {start|stop|status|reload|restart}"
exit 1
;;
esac
exit $?
4 -Включить и запустить службу:(с правами root)
chkconfig openvpn-custom on
service openvpn-custom start
вы можете проверить статус услуги с помощьюservice openvpn-custom status
Как убедиться, что openvpn запускается только тогда, когда сеть готова
Определение chkconfig в начале сценария инициализации определяет, какой номер S/K он получает.
Каждый «уровень выполнения» на самом деле представляет собой просто каталог(/etc/rc *..d/)полный символических ссылок на сценарии инициализации(/etc/init.d/)названный с пронумерованными записями S и K.
S означает запуск, а K означает уничтожение. Когда init переходит на уровень выполнения, он начинается с S01 и переходит к S99, запуская каждый сценарий инициализации для запуска службы, которой управляет этот сценарий. Когда init покидает уровень выполнения, он начинается с K01 и переходит к K99, запуская каждый сценарий для остановки службы, которой управляет этот сценарий.
man chkconfig дает пример определения службы в стиле chkconfig -и определения службы в стиле базы стандартов Linux (LSB ).
Если в сценарии инициализации определены оба типа, определение LSB должно иметь приоритет над определением chkconfig.
Если у вас есть служба, которая зависит от сетевого подключения, вы можете либо убедиться, что ваша служба запускается после /etc/rc *.d/S10network, назначив ей начальный номер после 10, либо вы можете увидеть, что /etc /init.d/network имеет определение LSB Предоставляет :$network , поэтому вы можете использовать определение LSB Обязательное -Start :$network в своем скрипте инициализации.
Настройка передачи и телеграммы при загрузке (на основе статуса openvpn):
То же, что и решение openvpn, создайте новую службу (, затем включите и запустите ее ), содержащую следующий код (/etc/rc.d/init.d/openvpn -apps)
#!/bin/bash
#
# chkconfig: 2345 55 45
# description: Custom openvpn-apps script
# processname: openvpn-apps
#
### BEGIN INIT INFO
# Provides: openvpn-apps
# Required-Start: $network
# Required-Stop: $network
# Default-Start: 2 3 4 5
# Short-Description: The openvpn-apps daemon
# Description: The openvpn daemon custom script
### END INIT INFO
#/etc/rc.d/init.d/openvpn-apps
# Source function library.
. /etc/init.d/functions
start() {
echo -n "Starting custom openvpn... "
/full-path-to/your/apps.sh
return 0
}
stop() {
echo -n "Shutting down custom openvpn... "
/full-path-to/your/stop-apps.sh
return 0
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
;;
restart)
stop
start
;;
reload)
;;
*)
echo "Usage: openvpn-apps {start|stop|status|reload|restart}"
exit 1
;;
esac
exit $?
Ваш файл apps.sh будет выглядеть примерно так
#!/bin/sh
/bin/sed s/IP_ADDRESS/$4/ /var/lib/transmission/.config/transmission/settings_template.json > /var/lib/transmission/.config/transmission/settings.json
/etc/init.d/transmission-daemon start
/etc/init.d/transmission-telegram start
Чтобы сделать ваш apps.sh зависимым от статуса openvpn, вы можете сначала отложить запуск apps.sh с помощьюsleep
или написать цикл bash, который проверяет openvpn с помощью ps или проверить результат пинга к вашему шлюзу openvn (в apps.sh)или вы можете просто проверить результатservice openvpn-custom status
(в apps.sh)
Отказоустойчивый openvpn:
Вы можете настроить «отказоустойчивость», чтобы сеть отключилась, если openvpn не работает, и, таким образом, предотвратить утечку соединений, когда vpn не работает. Для этого вы можете использовать это или это решение
Заставить приложение использовать определенный интерфейс:
Если ваша установка openvpn туннелирует/маршрутизирует всю систему; в этом нет необходимости, но если вы не направляете весь трафик через интерфейс openvpn, вы можете проксировать/привязать/заставить свои приложения (передачи/телеграммы )использовать vpn; В Linux существует несколько решений для привязки приложения к определенному интерфейсу, у каждого из которых есть свои плюсы и минусы. Этот ответ unix stackexchange подробно объясняет большинство доступных возможностей
В вашем случае, я думаю, вы также могли бы максимально придерживаться стандартных процедур.
Начиная с нетронутой CentOS 6.10 минимальной установки ISO, я бы действовал следующим образом:
Во-первых, включить неограниченный OpenVPN :CentoOS 6 поставляется со стандартной политикой SELinux, которая по умолчанию запускает /usr/sbin/openvpn
двоичный файл в ограниченном режиме, который в основном разрешает только сетевые настройки, тем самым предотвращая любой вспомогательный скрипт. чтобы можно было сделать что-нибудь полезное. Однако CentOS 6 также предоставляет один простой параметр для включения неограниченного OpenVPN. Как суперпользователь запустите:
setsebool -P openvpn_run_unconfined on
Подождите несколько секунд, так как это может занять некоторое время.
Вы можете вернуть его в ограниченный режим, как только все заработает. Есть несколько жизнеспособных подходов, к которым я вернусь позже.
Затем, чтобы продолжить базовую настройку, установите репозиторий EPEL в yum вашей системы:
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
Это дает yum вашей системы репозиторий, который предоставляет пакеты RPM для openvpn и передачи, упакованные для CentOS 6.
После этого вы можете сделать:
yum install openvpn transmission-daemon
Затем установите бота transmission-telegram
, как вы уже сделали. Просто не забудьте поместить его в каталог, указанный в $PATH
. Принимая во внимание политику CentOS 6 SELinux, /usr/local/bin
может быть хорошим выбором.
(Пожалуйста, обратите внимание , что я не могу подробно рассказать о ботах Telegram, потому что я ничего о нем не знаю и даже не могу его протестировать, потому что вообще не пользуюсь Telegram.)
Затем создайте скрипт openvpn-transmission-up.sh
наподобие:
#!/bin/bash
PATH+=":/sbin:/usr/sbin"
service transmission-daemon start
service transmission-daemon status && telegram-bot-start.sh
telegram-bot-start.sh
— это просто гипотетическая оболочка для запуска фактической команды, которая запускает бота Telegram, и выполняется только в случае успешного запуска демона передачи -. Вы также можете использовать прямую команду вместо сценария-оболочки, если прямую команду можно сделать одной строкой -, которая будет помещена после &&
.
Затем также сделайте скрипт openvpn-transmission-down.sh
наподобие:
#!/bin/bash
PATH+=":/sbin:/usr/sbin"
telegram-bot-stop.sh
service transmission-daemon stop || true
Здесь вы также можете использовать прямые команды для остановки бота Telegram вместо обёртки telegram-bot-stop.sh
, даже если они на самом деле представляют собой последовательность команд.
Затем сделайте два вышеуказанных сценария работоспособными:
chmod +x openvpn-transmission-up.sh openvpn-transmission-down.sh
и снова поместите их в каталог /etc/openvpn/scripts
(, чтобы соответствовать политике CentoOS SELinux ). Создайте этот каталог, если у вас его еще нет.
Затем поместите свой собственный конфиг для OpenVPN в /etc/openvpn
. Такой файл можно назвать как угодно, но он должен иметь суффикс .conf
.
Убедитесь, что в этом файле .conf
есть следующие строки:
script-security 2
route-up scripts/openvpn-transmission-up.sh
route-pre-down scripts/openvpn-transmission-down.sh
Если у вас уже есть скрипты route-up
или route-pre-down
, просто объедините существующие скрипты до -с указанными выше соответственно, но обязательно поместите их в /etc/openvpn/scripts
.
Приведенная выше настройка гарантирует, что ваш бот Transmission и Telegram всегда будут следовать судьбе VPN-туннеля.
Наконец, установите openvpn для запуска при загрузке:
chkconfig openvpn on
Этот последний параметр зависит от установки, поставляемой с пакетом RPM для OpenVPN, что позволяет запускать его только после успешного запуска общей сети.
Обратите внимание: я думаю, вам не нужно настраивать Transmission, потому что конфигурации по умолчанию, поставляемой с пакетом RPM, должно быть достаточно. Однако, если вы хотите повторно использовать команду sed
для установки IP-АДРЕСА _, поместите эту команду sed
в сценарий openvpn-transmission-up.sh
перед запуском демона передачи -. В любом случае, обычно лучше использовать $ifconfig_local
вместо $4
.
К этому моменту все должно быть готово. Вы можете проверить это с помощью простого service openvpn
, за которым следует start
, или stop
, или restart
и т. д. Или просто перезагрузив безголовый сервер.
ПРИМЕЧАНИЕ : если ваш провайдер VPN требует аутентификации с помощью имени пользователя и пароля, вам нужно будет поместить их в файл в две отдельные строки. Этот файл должен находиться в папке /etc/openvpn
в соответствии с политикой SELinux. Затем включите auth-user-pass /etc/openvpn/credentials-file
в ваш файл openvpn .conf
. Если вы этого не сделаете, CentOS остановится во время загрузки, ожидая интерактивного ввода учетных данных, или просто OpenVPN может просто отказаться запускаться.
Что касается (повторного -)усиления вышеуказанной настройки, в зависимости от ваших предпочтений вы можете быть довольны тем, как есть :установка на данный момент использует допустимые настройки, предварительно -установленные CentOS, в том числе тот, который позволяет OpenVPN работать с меньшими ограничениями, что в основном позволяет вспомогательным сценариям свободно выполнять двоичные файлы, доступные в системе. Как бы расплывчато это ни звучало, он по-прежнему более ограничен, чем полное отсутствие SELinux, и, оставив все таким образом, и Transmission, и Telegram-бот работают с немного большими ограничениями, чем их стандартная (или ручная )установка. разрешать.
Если вы хотите вернуть OpenVPN в режим ограниченной работы, это все равно может быть довольно легко сделать, воспользовавшись тем фактом, что CentOS 6 фактически использует Upstart в качестве своего /sbin/init
, даже несмотря на то, что большая часть операций загрузки зависит от устаревшего Скрипты в стиле SysVinit -. Однако вам потребуются дополнительные шаги:
Для начала переведите OpenVPN обратно в ограниченный режим:
setsebool -P openvpn_run_unconfined off
Теперь, если вы запустите OpenVPN, вспомогательные скрипты не смогут запустить бота Transmission и Telegram.
Итак, пользовательская политика SELinux:
Создайте файл с именемopenvpn-talk-upstart.te
точно следующим образом:
module openvpn-talk-upstart.mod 1.0;
require {
type openvpn_t;
type init_t;
class unix_stream_socket connectto;
}
allow openvpn_t init_t:unix_stream_socket connectto;
Затем выполните следующие команды:
checkmodule -m -M -o openvpn-talk-upstart.mod openvpn-talk-upstart.te
semodule_package -o openvpn-talk-upstart.pp -m openvpn-talk-upstart.mod
semodule -i openvpn-talk-upstart.pp
последняя команда может занять некоторое время.
Затем задания Upstart:
Создайте файл /etc/init/transmission-up.conf
следующим образом:
task
exec service transmission-daemon start
и файл /etc/init/transmission-down.conf
следующим образом:
task
exec service transmission-daemon stop
Тогда вам нужны задания Upstart для бота Telegram.
Для согласованности с моим примером я придерживаюсь своего гипотетического подхода к сценариям, поэтому файлы заданий, названные, например, /etc/init/telegram-bot-up.conf
и /etc/init/telegram-bot-down.conf
, будут такими же, как файлы Transmission, только с командами exec
ed, преобразованными в (соответственно)/usr/local/bin/telegram-bot-start.sh
и /usr/local/bin/telegram-bot-stop.sh
.
Обратите внимание, что здесь, в зависимости от вашего доверия к Upstart, вы также можете поместить соответствующие команды непосредственно в файлы заданий, в ключевые слова script... end-script
вместо ключевого слова exec
,или вы даже можете создать демона, полностью контролируемого Upstart -, с помощью одного единственного файла задания Upstart (, но не типа task
), если вам так хочется.
После этого сделайте вспомогательный сценарий OpenVPN openvpn-transmission-up.sh
в /etc/openvpn/scripts
следующим:
#!/bin/sh
/sbin/start transmission-up && /sbin/start telegram-bot-up
и сценарий openvpn-transmission-down.sh
:
#!/bin/sh
/sbin/start telegram-bot-down
/sbin/start transmission-down || true
Обратите внимание на использование команды /sbin/start
, хотя на самом деле это операция «вниз».
Теперь все должно работать с OpenVPN в исходном ограниченном (, т.е. более безопасном )режиме, но и с Transmission, и с ботом Telegram в их стандартном «бесплатном» (, т.е. менее безопасном )режиме.
Если вы хотите еще больше усилить защиту этих двух последних, вам нужно будет запустить их в ограниченном контексте SELinux, например, для OpenVPN, а затем провести тщательный анализ файла /var/log/audit/audit.log
, чтобы точно настроить политику SELinux. В этом вам могут помочь инструменты, а именно команда audit2allow
, доступная в пакете policycoreutils-python
.
Вы можете запустить эту команду поверх audit.log
, полученного из SELinux в разрешительном режиме (, см. файл /etc/sysconfig/selinux
), но это может привести к слишком большому разрешению. В противном случае вы можете запустить его поверх audit.log
, который исходит от обычного принудительного SELinux, выполняя его шаг -за шагом -, пока вы, наконец, не доберетесь до рабочей настройки. В последнем случае вы можете быть уверены, что разрешаете только то, что действительно необходимо.
Вывод из audit2allow -a -m...
должен быть передан в checkmodule -m -M -o...
, затем вывод этого последнего в semodule_package -o... -m...
и, наконец, semodule -i
файла, сгенерированного semodule_package
. Эта итерация на каждом шаге анализа.
Это может быть очень долгой задачей, и даже когда вы доберетесь до рабочей установки, это может быть так только вначале :в какой-то момент вы можете столкнуться с неожиданными проблемами "отказ в доступе" позже на, например в первый раз, когда ваша передача или бот Telegram,пытается получить доступ к чему-то, чего раньше не пробовал.