Google аутентификация на oauth2_proxy

http://it.icmp.ru/postimages/1181/7695/thumb/oauth.png


Установка и настройка 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.
  • просмотров: ~493
  • рейтинг: ?

Комментарии (0)

Вы - anonymous, войти ?

можно использовать bbcode-теги
[b]жирный текст[/b]
[i]курсив[/i]
[u]underline[/u]
[s]зачеркнутый текст[/s]
[size=20px]размер шрифта[/size]
всякие изменения текста
[left][/left]
[right][/right]
[center][/center]
позиционирование элементов: картинки, текст и т.д
[url][/url]
[email][/email]
внутри тега [url] помещайте ссылки, а внутри [email] адрес электронной почты;
так же [url] можно использовать в виде:
[url=http://example.com]пример[/url],
[url=http://test.ru][img]http://flickr.com/givemeimg.png[/img][/url]
[code][/code]
[quote][/quote]
внутри тега [code] можно помещать программный код (подстветка попытается включиться автоматически); для выделения цитат используйте [quote]
также можно напрямую указать язык [code=cpp]int i;[/code]
[list][/list]
создаем списки, каждый элемент пишется после [*].

Можно указывать маркер - [list=marker].
возможные маркеры 1(decimal), i(lower-roman), I(upper-roman), a(lower-alpha), A(upper-alpha). Примеры:

[list][*]1 элемент[*]2 элемент[*]3 элемент[/list]
[list=1][*]1 элемент[*]2 элемент[*]3 элемент[/list]
[list=A][*]1 элемент[*]2 элемент[*]3 элемент[/list]
[table][/table]
оформляем таблицу, используя внутренние теги [tr] и [td].
[tr] - строка, [td] - поле в строке,
[table=100%] - можно задавать ширину в процентах, по-умолчанию ширина 100%
[td=2] - можно задавать сколько столбцов входит в это поле. Пример:

[table=50%][tr][td]столбец 1[/td][td]столбец 2[/td][/tr][tr][td]значение 1[/td][td]значение 2[/td][/tr][tr][td=2]сразу 2 столбца[/td][/tr][/table]
[img][/img]
тег для вставки фото или картинок, мы любим картинки. Примеры использования:

[img]http://ya.ru/logo.png[/img],
[img=100x100px]http://ya.ru/logo.png[/img]
[img=fullimg.url]thumbimg.url[/img],
Пожалуйста загружайте картинки на наш сайт, либо вставляйте с бекбоновских ресурсов.
[video][/video]
Проигрывает видео, внутрь вставляем ссылки на видео, поддерживается Play.Ykt.Ru(нужно вставить ссылку на страницу с видео) и tv.ykt.ru(нужно вставить ссылку на адрес файла)