По-перше , як уже сказали декілька людей, важливим є збереження облікових даних окремо від сценарію. (Окрім підвищеної безпеки, це також означає, що ви можете повторно використовувати один і той же сценарій для декількох систем з різними обліковими даними.)
По-друге , вам слід врахувати не тільки безпеку облікових даних, але й вплив, якщо / коли ці облікові дані будуть порушені. У вас не повинно бути лише одного пароля для доступу до бази даних, у вас повинні бути різні облікові дані з різним рівнем доступу. Наприклад, ви можете мати одного користувача БД, який має можливість здійснювати пошук у базі даних - цей користувач повинен мати доступ лише для читання. Інший користувач може мати дозвіл на вставлення нових записів, але не видаляти їх. Третя може мати дозвіл на видалення записів.
Окрім обмеження дозволів для кожного облікового запису, ви також повинні мати обмеження щодо того, звідки можна використовувати кожен обліковий запис. Наприклад, обліковий запис, який використовується вашим веб-сервером, не повинен дозволяти з'єднатися з будь-якою іншою IP-адресою, ніж веб-сервер. Обліковий запис з повними правами доступу до бази даних дійсно повинен бути дуже обмежений з точки зору того, звідки він може з'єднуватися, і ніколи не повинен використовуватися, крім інтерактивного. Також розгляньте можливість використання збережених процедур у базі даних, щоб обмежити, що саме може зробити кожен обліковий запис.
Ці обмеження потрібно реалізувати на стороні DB-сервера системи, так що навіть якщо клієнтська частина порушена, обмеження не можуть бути змінені з неї. (І, очевидно, що сервер БД повинен бути захищений брандмауерами тощо, крім конфігурації БД ...)
У випадку з обліковим записом БД, дозволений лише обмежений доступ лише для читання, і лише з певної IP-адреси, вам, можливо, не знадобляться додаткові облікові дані, ніж це, залежно від чутливості даних та безпеки хосту сценарію запускається з. Одним із прикладів може бути форма пошуку на вашому веб-сайті, яку можна запустити з користувачем, якому дозволено використовувати лише збережену процедуру, яка витягує лише ту інформацію, яка буде представлена на веб-сторінці. У цьому випадку додавання пароля насправді не надає додаткової безпеки, оскільки ця інформація вже призначена для загального доступу, і користувач не може отримати доступ до будь-яких інших даних, які були б більш чутливими.
Також переконайтеся, що підключення до бази даних здійснюються за допомогою TLS, або хтось, хто слухає мережу, може отримати ваші облікові дані.
По-третє , подумайте, який тип облікових даних використовувати. Паролі - це лише одна форма, і не найбезпечніша. Натомість ви можете використовувати якусь форму пари відкритих / приватних ключів, або AD / PAM тощо.
По-четверте , розглянемо умови, за яких буде виконуватися сценарій:
Якщо він запускається в інтерактивному режимі, тоді вам слід ввести пароль, або пароль до приватного ключа, або приватного ключа, або увійти в систему за допомогою дійсного квитка Kerberos, коли ви запускаєте його - іншими словами, сценарій повинен отримати його дані безпосередньо від вас під час запуску, замість того, щоб читати їх з якогось файлу.
Якщо він запускається з веб-сервера, подумайте про налаштування облікових даних у момент запуску веб-сервера. Хорошим прикладом тут є сертифікати SSL - вони мають публічний сертифікат та приватний ключ, а в приватному ключі є пароль. Ви можете зберігати приватний ключ на веб-сервері, але вам все одно потрібно ввести пароль, коли ви запускаєте Apache. Ви також можете мати облікові дані для певного обладнання, наприклад фізичної картки або HSM, яке можна видалити або заблокувати після запуску сервера. (Звичайно, недоліком цього методу є те, що сервер не може перезапуститись самостійно, якщо щось трапиться. Я вважаю за краще це перед ризиком пошкодити свою систему, але ваш пробіг може відрізнятися ...)
Якщо сценарій запускається з cron, це складна частина. Ви не хочете, щоб облікові дані лежали в будь-якій точці вашої системи, де хтось може отримати до них доступ, - але ви хочете, щоб вони лежали, щоб ваш скрипт мав доступ до них, правда? Ну, не зовсім правильно. Поміркуйте, що саме робить сценарій. Які дозволи потрібні для бази даних? Чи можна його обмежити, щоб не було значення, чи не так пов’язана неправильна людина з цими дозволами? Чи можете ви замість цього запустити скрипт безпосередньо на сервері БД, до якого ніхто інший не має доступу, а не на сервері, на якому є інші користувачі? Якщо з якихось причин, про які я не можу придумати, у вас абсолютно повинен бути запущений сценарій на незахищеному сервері, і він повинен бути в змозі зробити щось небезпечне / руйнівне ... зараз настав час переосмислити свою архітектуру.
По-п’яте , якщо ви цінуєте безпеку вашої бази даних, ви не повинні запускати ці сценарії на серверах, до яких інші люди мають доступ. Якщо хтось увійшов у вашу систему, то він матиме можливість отримати доступ до ваших облікових даних. Наприклад, у випадку веб-сервера з сертифікатом SSL існує принаймні теоретична можливість того, що хтось зможе отримати корінь та отримати доступ до області пам'яті процесу httpd та витягнути облікові дані. Останнім часом був принаймні один подвиг, коли це можна було зробити через SSL, навіть не вимагаючи входу зловмисника.
Також розглядайте можливість використання SELinux або apparmor або будь-якого іншого, що доступне для вашої системи, щоб обмежити, які користувачі можуть робити. Вони дозволять вам заборонити користувачам навіть намагатися підключитися до бази даних, навіть якщо їм вдасться отримати доступ до облікових даних.
Якщо все це здасться вам надмірним , і ви не можете дозволити собі або не маєте часу на це - тоді, на мою думку (зарозумілою та елітарною), у вашій базі даних не слід зберігати нічого важливого чи чутливого. І якщо ви не зберігаєте нічого важливого чи чутливого, то там, де ви зберігаєте свої облікові дані, також не важливо - у такому разі навіщо взагалі використовувати пароль?
Нарешті , якщо ви абсолютно не можете уникнути зберігання якихось облікових даних, ви можете мати облікові дані лише для читання, а власник root та root може надати право власності на надзвичайно тимчасову основу, коли про це потрібно зробити сценарій (тому що ваш сценарій не повинен бути запускати як root, якщо це абсолютно не потрібно, а підключення до бази даних не робить необхідним). Але це все-таки не дуже гарна ідея.