Если вы являетесь активным пользователем Redmine, содержимое которого наверняка конфиденциально, вы наверняка задумывались над усилением безопасности приложения.
В этой статье описана процедура настройки авторизации в Redmine через одноразовые пароли (OTP) с помощью мобильного приложения Google Authenticator.
Статья описывает установку и настройку Google Authenticator, а так же плагина redmine_pam_auth для Redmine 2.2 под ОС CentOS 6.
Устанавливаем Google Authenticator
Для этого подключаем репозиторий Southbridge:
rpm -Uhv http://rpms.southbridge.ru/southbridge-rhel6-stable.rpm
Или ставим rpm напрямую, без подключения репозитория:
rpm -Uhv http://rpms.southbridge.ru/rhel6/stable/x86_64/google-authenticator-1.0-0.gita096a62.el6.x86_64.rpm
Устанавливаем pam-mysql
Можно обойтись и без него, но тогда придется добавить пользователя «redmine» в группу «shadow» или запускать Redmine под рутом, что в свете последних эксплоитов в rails кажется плохой идеей.
yum install pam-mysql
Создаем конфиг pam для авторизации через google authenticator
Файл /etc/pam.d/rpam
#%PAM-1.0
account required pam_mysql.so user=<redmine_db_user> passwd=<redmine_db_password> host=<redmine_db_host> db=<redmine_dbname> table=users usercolumn=login passwdcolumn=login crypt=0
auth required pam_google_authenticator.so user=redmine secret=/opt/redmine/tmp/google-authenticator/${USER}
auth required pam_env.so
session required pam_unix.so
Устанавливаем плагин авторизации через pam для Redmine
Клонируем плагин из github
cd /opt/redmine
git clone git://github.com/cardil/redmine-pam-auth.git plugins/redmine_pam_auth
Устанавливаем pam-devel, который потребуется для компиляции гема rpam-ruby19
yum install pam-devel
Устанавливаем необходимые гемы для работы redmine-pam-auth (обратите внимание на исключения --without — возможно в вашей конфигурации используется rmagick, postgresql или что-то еще). Если вы еще не используете bundler — очень рекомендую, это намного удобнее, чем установка гемов в систему вручную.
cd /opt/redmine
bundle install --without development test sqlite postgresql rmagick --path vendor/bundle
Выполняем миграции плагинов
bundle exec rake redmine:plugins:migrate RAILS_ENV="production"
Генерируем ключи пользователей для Google Authenticator
Создаем папку для хранения ключей Google Authenticator
mkdir /opt/redmine/tmp/google-authenticator
Генерируем ключи (подробное описание ключей командной строки можно посмотреть с помощью параметра "--help" — вы можете использовать параметры авторизации на свое усмотрение).
Параметр "--label=username@example.net" — метка, которая поможет идентифицировать аккаунт в мобильном приложении Google Authenticator. Параметр "--secret=/opt/redmine/tmp/google-authenticator/username" — хранилище ключей, где username — имя пользователя в Redmine.
google-authenticator --time-based --disallow-reuse --qr-mode=UTF8 --force --no-rate-limit --window-size=17 --label=username@example.net --secret=/opt/redmine/tmp/google-authenticator/username
Корректируем права
chown -R redmine:redmine /opt/redmine/tmp/google-authenticator
chmod 0600 /opt/redmine/tmp/google-authenticator/username
Устанавливаем бесплатное приложение Google Authenticator
Мобильное приложение Google Authenticator доступно для iPhone, Android и BlackBerry.
Подробнее о установке можно почитать на странице помощи Google.
Во время генерации ключей google-authenticator выводит ссылку типа https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/username@example.net%3Fsecret%3DDOYZKVDCN7GUGJH3 — заходим на нее в браузере и сканируем из мобильного приложения Google Authenticator отображенный QR-код.
Настраиваем Redmine
В профиле пользователя Redmine указываем режим аутентификации «Pam»
Готово!
Теперь при авторизации вам достаточно указать имя пользователя, запустить Google Authenticator на мобильном телефоне и переписать цифры в поле ввода пароля.
В одной из следующих статей напишу о шифровании Wiki — это поможет избежать утечки данных из Wiki в случае, если сервер, на котором размещен Redmine, все же взломали и загрузили базу данных. Кому интересно, добро пожаловать на наш Хабра-блог.