Во-первых , как уже говорили несколько человек, необходимо хранить учетные данные отдельно от сценария. (В дополнение к повышению безопасности это также означает, что вы можете повторно использовать один и тот же сценарий для нескольких систем с разными учетными данными.)
Во-вторых , вы должны учитывать не только безопасность учетных данных, но и влияние, если / когда эти учетные данные будут скомпрометированы. У вас не должно быть только одного пароля для всего доступа к базе данных, у вас должны быть разные учетные данные с разными уровнями доступа. Например, у вас может быть один пользователь БД, который может выполнять поиск в базе данных - у этого пользователя должен быть доступ только для чтения. Другой пользователь может иметь право вставлять новые записи, но не удалять их. Третий может иметь разрешение на удаление записей.
В дополнение к ограничению разрешений для каждой учетной записи, у вас также должно быть ограничение на то, откуда каждая учетная запись может использоваться. Например, учетной записи, используемой вашим веб-сервером, не должно быть разрешено подключаться с любого другого IP-адреса, чем у веб-сервера. Учетная запись с полными корневыми правами доступа к базе данных должна быть действительно очень ограниченной с точки зрения того, откуда она может подключаться, и никогда не должна использоваться, кроме как в интерактивном режиме. Также рассмотрите возможность использования хранимых процедур в базе данных, чтобы точно ограничить возможности каждой учетной записи.
Эти ограничения должны быть реализованы на стороне DB-сервера системы, так что, даже если клиентская сторона скомпрометирована, ограничения не могут быть изменены от нее. (И, очевидно, сервер БД должен быть защищен брандмауэрами и т. Д. В дополнение к конфигурации БД ...)
В случае учетной записи БД, которой разрешен только ограниченный доступ только для чтения, и только с определенного IP-адреса, вам могут не потребоваться какие-либо дополнительные учетные данные, кроме этих, в зависимости от чувствительности данных и безопасности хоста сценария. бежит из. Одним из примеров может быть форма поиска на вашем веб-сайте, которую можно запустить с пользователем, которому разрешено использовать только хранимую процедуру, которая извлекает только информацию, которая будет представлена на веб-странице. В этом случае добавление пароля на самом деле не дает никакой дополнительной безопасности, поскольку эта информация уже должна быть общедоступной, и пользователь не может получить доступ к любым другим данным, которые были бы более конфиденциальными.
Также убедитесь, что соединение с базой данных установлено с использованием TLS, или любой, кто прослушивает сеть, может получить ваши учетные данные.
В-третьих , подумайте, какие учетные данные использовать. Пароли только одна форма, и не самая безопасная. Вместо этого вы можете использовать некоторую форму пары открытый / закрытый ключ или AD / PAM или тому подобное.
В-четвертых , рассмотрим условия, при которых будет выполняться скрипт:
Если он запускается в интерактивном режиме, то при запуске вы должны ввести пароль или пароль к закрытому ключу, или к закрытому ключу, или войти в систему с действительным билетом Kerberos - другими словами, скрипт должен получить его учетные данные непосредственно от вас в то время, когда вы запускаете его, вместо чтения их из какого-либо файла.
Если он запускается с веб-сервера, рассмотрите возможность настройки учетных данных во время запуска веб-сервера. Хорошим примером здесь являются сертификаты SSL - они имеют открытый сертификат и закрытый ключ, а закрытый ключ имеет пароль. Вы можете хранить закрытый ключ на веб-сервере, но вам все равно нужно ввести пароль к нему при запуске Apache. У вас также могут быть учетные данные на каком-либо оборудовании, таком как физическая карта или HSM, которое можно удалить или заблокировать после запуска сервера. (Конечно, недостатком этого метода является то, что сервер не может перезапуститься самостоятельно, если что-то случится. Я бы предпочел это риску взлома моей системы, но ваш пробег может отличаться ...)
Если скрипт запускается из cron, это сложная часть. Вы не хотите, чтобы учетные данные располагались где-то в вашей системе, где кто-то мог бы получить к ним доступ, но вы хотите, чтобы они располагались так, чтобы ваш скрипт мог получить к ним доступ, верно? Ну, не совсем верно. Рассмотрим точно, что делает сценарий. Какие разрешения нужны для базы данных? Можно ли его ограничить, чтобы не имело значения, подключается ли не тот человек с этими разрешениями? Можете ли вы вместо этого запустить скрипт непосредственно на сервере БД, к которому никто другой не имеет доступа, вместо того, чтобы с сервера, на котором есть другие пользователи? Если по какой-то причине, о которой я не могу думать, у вас обязательно должен быть запущен скрипт на небезопасном сервере, и он должен быть в состоянии сделать что-то опасное / разрушительное ... сейчас самое время переосмыслить свою архитектуру.
В-пятых , если вы цените безопасность своей базы данных, вам не следует запускать эти сценарии на серверах, к которым имеют доступ другие люди. Если кто-то вошел в вашу систему, он сможет получить ваши учетные данные. Например, в случае веб-сервера с сертификатом SSL существует, по крайней мере, теоретическая возможность того, что кто-то сможет получить root и получить доступ к области памяти процесса httpd и извлечь учетные данные. В последнее время был по крайней мере один эксплойт, в котором это можно было сделать по SSL, даже не требуя входа злоумышленника.
Также рассмотрите возможность использования SELinux или apparmor или чего-либо доступного для вашей системы, чтобы ограничить, какие пользователи могут делать что. Они позволят вам запретить пользователям даже пытаться подключиться к базе данных, даже если им удастся получить доступ к учетным данным.
Если все это звучит для вас излишне , и вы не можете себе позволить или у вас нет на это времени - тогда, по моему (высокомерному и элитарному) мнению, вам не следует хранить что-то важное или деликатное в своей базе данных. И если вы не храните ничего важного или конфиденциального, то где вы храните свои учетные данные, также не важно - в таком случае, зачем вообще использовать пароль?
Наконец , если вы абсолютно не можете избежать сохранения каких-либо учетных данных, у вас могут быть учетные данные только для чтения, и они могут принадлежать пользователю root, а root может предоставлять право владения исключительно на временной основе при запросе сценария (поскольку ваш сценарий не должен запускать с правами суперпользователя, если это абсолютно необходимо, и подключение к базе данных не делает это необходимым). Но это все еще не очень хорошая идея.