Хранение важных секретных ключей в файлах php
Мы создаем приложение с использованием PHP и некоторых сторонних сервисов, которым требуется секретный ключ API. У нас есть файл PHP, который содержит все определения ключей, которые мы затем импортируем (используя require_once) при необходимости.
Этот подход безопасен? Должны ли мы хранить ключи в другом месте?
Спасибо.
4 ответа
Нечто подобное было предложено сегодня для сценария оболочки. Ответ здесь также действителен: убедитесь, что вы храните файл вне корневого веб-каталога, или (если это невозможно) защитите его, используя .htaccess
файл.
Мне также нравится unset() любые переменные, содержащие конфиденциальные данные после использования, поэтому даже полный дамп переменной (например, в отладочном сообщении) позже в этом скрипте не может раскрыть его.
Это должно быть относительно безопасно, пока файл не доступен из Интернета. Многие сайты размещают конфиденциальные файлы вне веб-корня на сервере и просто включают их при необходимости в свое приложение.
Я всегда устанавливаю разрешения для сертификатов и других файлов, содержащих конфиденциальные данные, так что только моя команда разработчиков и служба apache могут получить доступ к файлу. Это важно, если вы используете сервер, общий для большой организации, например, для университета, где многие люди могут иметь разрешения на файл по умолчанию. Часто я видел разрешения на чтение, данные каждому, чтобы веб-сервер мог получить доступ к файлу (так как он не является ни владельцем, ни групповым разрешением для файла, остается только дать чтение "другому").
Вместо этого я гарантирую, что есть группа, содержащая только мою команду разработчиков, и устанавливаю права на чтение / запись для файла для этой группы. Затем я использую ACL для добавления разрешения на чтение для службы APACHE. Вы должны использовать ACL, поскольку владелец и группа обычно настроены на группу разработчиков и группу разработчиков, и у вас не останется никаких вариантов настройки доступа для apache, кроме использования ACL.
Безопасность путем запутывания:
- создать собственное пространство имен с функцией кодирования, декодирования
- добавить auto_prepend_file в
php.ini
в /usr/share/nginx/outsidehtml/keystorage/83738489384828838227.php - запустить nginx или apache в chroot,selinux
- отключить разрешение на запись в папку keystorage
setfacl -m user:nginx:x /usr/share/nginx/outsidehtml/keystorage/
- добавлять
php.ini
disable_class = ReflectionFunction disable_function = opcache_get_status,phpinfo,show_source,ini_get - Для лучшей защиты вы можете сохранить ключ в php.ini как значение, т.е. 123key = secret64
ТЕСТОВОЕ ЗАДАНИЕ
print_r(glob('/usr/share/nginx/outsidehtml/keystorage/*.*'));