Установка и настройка reverse proxy oauth2_proxy. Пригодится например для защиты самописных ресурсов или любых других, которые не поддерживают механизмы аутентификации или авторизации.
Установка:
Установим golang: yum install golang -y
Настроим переменные окружения golang: vi /etc/profile.d/go.sh
#!/bin/bash
export GOPATH=/usr/share/gocode
export GOROOT=/usr/lib/golang
Применим переменные окружения:
chmod +x /etc/profile.d/go.sh
source /etc/profile.d/go.sh
Если используете фаервол, то убедитесь, что открыт порт протокола git на исходящие иначе сборка зависнет на этапе установки fsnotify.
Сборка бинарника:
go -v get github.com/bitly/oauth2_proxy
ln -s /usr/share/gocode/bin/oauth2_proxy /usr/bin
Настройка google аутентификации:
Необходимо создать проект, id и key.
Идем на: https://developers.google.com -> google api console
В диспетчере google apis в верхнем левом углу нажимаем на project -> создать проект
Вводим название проекта и жмем "создать". Далее там же выбираем уже созданный проект.
Идем в меню учетные данные -> создать учетные данные -> идентификатор клиента oauth -> тип приложения веб-приложение
Далее выбираем созданную учетку и вводим название (пусть будет mysite).
Разрешенные источники javascript: https://mysite.example.com
Разрешенные URI перенаправления: https://mysite.example.com/oauth2/callback (по моему oauth2/callback может быть произвольной записью т.е. можно написать при желании хоть https://mysite.example.com/chupakabra)
Снова переходим в учетные данные и выбираем пункт окно запроса доступа oauth, где вводим название продукта mysite и url главной страницы https://mysite.example.com (тогда после авторизации нас редиректит на этот url). Название продукта будет высвечиваться на этапе когда приложение запросит доступ при аутентификации.
Настройка oauth2_proxy:
Накидаем файл конфигурации:
mkdir /etc/oauth2_proxy
vi /etc/oauth2_proxy/mysite.cfg
http_address = "127.0.0.1:4180" #слушаем localhost интерфейс на порту 4180
redirect_url = "https://mysite.example.com/oauth2/callback" #собственно та ссылку которую указывали в разрешенные uri перенаправления
upstreams = [
"http://mysite.example.com" #тут пишем на какой хост перенаправлять запросы после успешной аутентификации (предположим что бекенд работает без ssl)
#адрес бекенда указать в /etc/hosts (зависит от того как у вас настроен dns)
]
request_logging = true #если true то будет сливать лог прямо в stdout (т.е. в терминал)
#email_domains = [
# "gmail.com" #если раскоментируете эти строки то доступ получат все пользователи которые зарегистрированы в домене gmail.com
#]
authenticated_emails_file = "/etc/oauth2_proxy/mysite.txt" #список тех аккаунтов которые могут получить доступ
client_id = "xxxxxxxxxxxxxxxxx" #идентификатор клиента (указан в учетных данных)
client_secret = "xxxxxxxxxxxxxxxxx" #секрет клиента (указан в учетных данных)
provider="google" #собственно провайдер oauth2
cookie_name = "mysite.example.com" #название кукиса
cookie_secret = "xxxxxxxxxxxxxxxxx" #ключ шифрования кукиса (сгенерируйте произвольный пароль)
cookie_domain = "example.com" #домен кукиса
cookie_expire = "168h0m0s" #время жизни кукиса
cookie_secure = true #если ресурс доступен по https то обязательно true если нет то false
cookie_httponly = true #если ресурс доступен по https то обязательно true если нет то false
footer = "-" #скрываем информацию о верссии программы с футера
skip-provider-button = true #по идее если true то сразу должен загрузится список аккаунтов вместо того чтобы показывать кнопку sign in with google но видимо не работает
Создаем список аккаунтов: echo -e "myfriend@gmail.com\nmyfriend2@gmail.com" >> /etc/oauth2_proxy/mysite.txt
Когда будете дополнять список аккаунтов, то можно не перезапускать прокси поскольку список подхватывается на лету.
Накидаем какой нить такой скрипт запуска: vi /root/bin/oauth2_proxy.sh
#!/bin/bash
CFG="mysite.cfg"
CFG_PATH="/etc/oauth2_proxy"
PID_FILE="mysite_oauth2.pid"
PID_PATH="/var/run"
function start {
oauth2_proxy --config=$CFG_PATH/$CFG &
ps -ef|grep $CFG|head -n1|awk '{print $2}' > $PID_PATH/$PID_FILE
}
function stop {
if [ -f "$PID_PATH/$PID_FILE" ]; then
PID=`cat $PID_PATH/$PID_FILE`
else
echo "$PID_PATH/$PID_FILE doesn't exist"
exit 0
fi
if [ -z "$PID" ]; then
echo "$PID empty"
exit 0
fi
kill -9 $PID
echo -n > $PID_PATH/$PID_FILE
}
function status {
PID=`cat $PID_PATH/$PID_FILE`
if [ ! -z "$PID" ]; then
echo "Running..."
else
echo "Not running"
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
restart)
stop
sleep 1
start
;;
*)
echo $"Usage: $0 {start|stop|status|restart}"
;;
esac
Настройка nginx:
Без комментариев.
server {
listen 80;
server_name mysite.example.com;
rewrite ^(.*) https://$host$1;
server_tokens off;
}
server {
listen 443 ssl;
ssl on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA256:ECDHE-ECDSA-AES256-SHA256:ECDHE-RSA-AES256-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA256:DHE-RSA-AES256-SHA256:AES256-GCM-SHA384:AES256-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:AES128-GCM-SHA256:AES128-SHA256:AES128-SHA:DES-CBC3-SHA:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_certificate /etc/letsencrypt/live/mysite.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mysite.example.com/privkey.pem;
server_name mysite.example.com;
server_tokens off;
add_header Strict-Transport-Security max-age=2592000;
access_log /usr/local/nginx/logs/mysite_access.log main;
error_log /usr/local/nginx/logs/mysite_error.log;
location / {
proxy_pass http://127.0.0.1:4180;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
}
location ^~ /.well-known {
alias /var/www/html/.well-known;
charset off;
add_header Content-Type text/plain;
}
}
Теперь если зайти на https://mysite.example.com, то нас встретит унылая кнопочка.
Статья не гарантирует, что все заработает на личных аккаунтах поскольку тестировалось и работает на домене заведенном в google apps for business.