Вирішуючи, які дозволи використовувати, ви повинні точно знати, хто ваші користувачі та що їм потрібно. Веб-сервер взаємодіє з двома типами користувачів.
Аутентифіковані користувачі мають обліковий запис користувача на сервері і можуть мати певні привілеї. Зазвичай це включає системні адміністратори, розробники та облікові записи служб. Зазвичай вони вносять зміни в систему за допомогою SSH або SFTP.
Анонімні користувачі - відвідувачі вашого веб-сайту. Хоча вони не мають дозволу на прямий доступ до файлів, вони можуть надіслати запит на веб-сторінку, а веб-сервер діє від їх імені. Ви можете обмежити доступ анонімних користувачів, уважно ставлячись до того, які дозволи має процес веб-сервера. У багатьох дистрибутивах Linux Apache працює як www-data
користувач, але він може бути різним. Використовуйте ps aux | grep httpd
або ps aux | grep apache
щоб побачити, що користувач Apache використовує у вашій системі.
Примітки щодо прав доступу до Linux
Linux та інші POSIX-сумісні системи використовують традиційні дозволи Unix. У Вікіпедії є чудова стаття про дозволи Filesystem, тому я не повторю все тут. Але є кілька речей, про які слід пам’ятати.
Біт виконання
інтерпретованих сценаріїв (наприклад, Ruby, PHP) працює нормально без дозволу на виконання. Тільки бінарні файли та сценарії оболонки потребують біт виконання. Щоб перейти (ввести) каталог, потрібно мати дозвіл на виконання цього каталогу. Цей веб-сервер потребує цього дозволу, щоб перелічити каталог або обслуговувати будь-які файли всередині нього.
Нові дозволи файлів за замовчуванням
Коли файл створюється, він зазвичай успадковує ідентифікатор групи того, хто його створив. Але іноді потрібно, щоб нові файли успадкували ідентифікатор групи папки, в якій вони створені, тож ви б увімкнули біт SGID у батьківській папці.
Значення дозволів за замовчуванням залежать від вашого umask. Umask віднімає дозволи з новостворених файлів, тому загальне значення 022 призводить до того, що файли створюються з 755. Під час співпраці з групою корисно змінити umask на 002, щоб створені вами файли могли бути змінені членами групи. І якщо ви хочете налаштувати дозволи завантажених файлів, вам потрібно змінити umask на apache або запустити chmod після завантаження файлу.
Проблема з 777
Коли ви перебуваєте на chmod 777
своєму веб-сайті, у вас немає ніякої безпеки. Будь-який користувач у системі може змінити або видалити будь-який файл на вашому веб-сайті. Але якщо серйозніше, пам’ятайте, що веб-сервер діє від імені відвідувачів вашого веб-сайту, і тепер веб-сервер може змінити ті самі файли, що і виконуються. Якщо на вашому веб-сайті є якісь вразливості програмування, їх можна використовувати, щоб знекровити ваш веб-сайт, вставити фішинг-атаки або викрасти інформацію з вашого сервера без того, щоб ви ніколи про це знали.
Крім того, якщо ваш сервер працює на відомій порту (що повинно запобігати некористувальним користувачам нерестувати послуги прослуховування, які є доступними у всьому світі), це означає, що ваш сервер повинен бути запущений root (хоча будь-який нормальний сервер негайно випаде до менш привілейованого облікового запису, коли порт буде зв'язаний). Іншими словами, якщо ви використовуєте веб-сервер, де основний виконуваний файл є частиною контролю версій (наприклад, програма CGI), залишаючи свої дозволи (або, з цього приводу, дозволи довідника, що містить, оскільки користувач може перейменувати виконуваний файл) на рівні 777 дозволяє будь-якому користувачу запускати будь-який виконуваний файл як root.
Визначте вимоги
- Розробникам потрібен доступ для читання / запису до файлів, щоб вони могли оновити веб-сайт
- Розробникам потрібно читати / писати / виконувати в каталогах, щоб вони могли переглядати
- Apache потребує доступу для читання до файлів та інтерпретованих сценаріїв
- Apache потребує читання / виконання доступу до справних каталогів
- Apache потребує читання / запису / виконання доступу до каталогів для завантаженого вмісту
Обслуговується одним користувачем
Якщо за підтримку сайту відповідає лише один користувач, встановіть їх як власника користувача у каталозі веб-сайтів та надайте користувачеві повний дозвіл rwx. Apache все ще потребує доступу, щоб він міг обслуговувати файли, тому встановіть www-data як власника групи та надайте дозволу групи rx.
У вашому випадку Єва, чиє ім'я користувача eve
, є єдиним користувачем, який підтримує contoso.com
:
chown -R eve contoso.com/
chgrp -R www-data contoso.com/
chmod -R 750 contoso.com/
chmod g+s contoso.com/
ls -l
drwxr-s--- 2 eve www-data 4096 Feb 5 22:52 contoso.com
Якщо у вас є папки, які потрібно записувати Apache, ви можете просто змінити значення дозволу для власника групи, щоб www-data мали доступ до запису.
chmod g+w uploads
ls -l
drwxrws--- 2 eve www-data 4096 Feb 5 22:52 uploads
Перевага цієї конфігурації полягає в тому, що іншим користувачам у системі стає важче (але це не неможливо *), оскільки лише користувач та власники груп можуть переглядати каталог вашого веб-сайту. Це корисно, якщо у файлах конфігурації є секретні дані. Будьте уважні до свого умаска! Якщо ви створите тут новий файл, значення дозволу, ймовірно, становлять 755. Ви можете запустити umask 027
так, що нові файли за замовчуванням становлять 640 ( rw- r-- ---
).
Обслуговується групою користувачів
Якщо за підтримку сайту відповідає не один користувач, вам потрібно буде створити групу, яка використовуватиметься для призначення дозволів. Рекомендується створити окрему групу для кожного веб-сайту та назвати групу після цього веб-сайту.
groupadd dev-fabrikam
usermod -a -G dev-fabrikam alice
usermod -a -G dev-fabrikam bob
У попередньому прикладі ми використовували власника групи, щоб надати привілеї Apache, але тепер це використовується для групи розробників. Оскільки власник користувача вже не корисний для нас, встановити його на root - це простий спосіб забезпечити те, що жодні привілеї не просочуються. Apache все ще потребує доступу, тому ми надаємо доступ для читання іншому світу.
chown -R root fabrikam.com
chgrp -R dev-fabrikam fabrikam.com
chmod -R 775 fabrikam.com
chmod g+s fabrikam.com
ls -l
drwxrwxr-x 2 root dev-fabrikam 4096 Feb 5 22:52 fabrikam.com
Якщо у вас є папки, для яких Apache потрібно писати, ви можете зробити Apache або власником користувача, або власником групи. Так чи інакше, він матиме весь необхідний йому доступ. Особисто я вважаю за краще зробити його власником, щоб розробники могли переглядати та змінювати вміст завантажуваних папок.
chown -R www-data uploads
ls -l
drwxrwxr-x 2 www-data dev-fabrikam 4096 Feb 5 22:52 uploads
Хоча це загальний підхід, є і зворотний бік. Оскільки кожен інший користувач у системі має ті ж привілеї до вашого веб-сайту, що й Apache, іншим користувачам легко переглядати ваш сайт та читати файли, які можуть містити секретні дані, наприклад ваші файли конфігурації.
Ви можете мати свій торт і з'їсти його теж
Це може бути покращено. Цілком законно, щоб власник мав менше привілеїв, ніж група, тому замість того, щоб витрачати власника користувача, призначивши його для root, ми можемо зробити Apache власником користувача у каталогах та файлах вашого веб-сайту. Це повернення сценарію єдиного технічного обслуговування, але воно працює однаково добре.
chown -R www-data fabrikam.com
chgrp -R dev-fabrikam fabrikam.com
chmod -R 570 fabrikam.com
chmod g+s fabrikam.com
ls -l
dr-xrwx--- 2 www-data dev-fabrikam 4096 Feb 5 22:52 fabrikam.com
Якщо у вас є папки, які потрібно записувати Apache, ви можете просто змінити значення дозволу для власника користувача, щоб www-data мали доступ для запису.
chmod u+w uploads
ls -l
drwxrwx--- 2 www-data dev-fabrikam 4096 Feb 5 22:52 fabrikam.com
При цьому слід бути обережним, що власник нових файлів користувача буде відповідати творцю, а не встановлювати його на www-data. Отже, будь-які нові файли, які ви створюєте, Apache не будуть читатими, поки ви їх не порушите.
* Розділення привілеїв Apache
Раніше я згадував, що насправді іншим користувачам можна проглядати ваш веб-сайт незалежно від того, якими привілеями ви користуєтесь. За замовчуванням всі процеси Apache працюють як один і той же користувач www-даних, тому будь-який процес Apache може читати файли з усіх інших веб-сайтів, налаштованих на одному сервері, а іноді навіть вносити зміни. Будь-який користувач, який може змусити Apache запустити сценарій, може отримати той самий доступ, що і сам Apache.
Для боротьби з цією проблемою існують різні підходи до поділу привілеїв в Apache. Однак кожен підхід має різні недоліки продуктивності та безпеки. На мою думку, будь-який сайт з більш високими вимогами до безпеки повинен працювати на спеціальному сервері, а не використовувати VirtualHosts на спільному сервері.
Додаткові міркування
Я раніше не згадував про це, але зазвичай це погана практика, щоб розробники редагували веб-сайт безпосередньо. Для великих сайтів вам набагато краще мати якусь систему випусків, яка оновлює веб-сервер із вмісту системи контролю версій. Підхід до єдиного технічного обслуговування, мабуть, ідеальний, але замість людини у вас є автоматизоване програмне забезпечення.
Якщо ваш веб-сайт дозволяє завантажувати файли, які не потрібно розміщувати, їх слід зберігати десь за межами кореня веб-сторінки. В іншому випадку ви можете виявити, що люди завантажують файли, які мали бути секретними. Наприклад, якщо ви дозволяєте студентам подавати завдання, вони повинні бути збережені в каталозі, який не обслуговується Apache. Це також хороший підхід для файлів конфігурації, які містять секрети.
Для веб-сайту з більш складними вимогами, можливо, ви захочете вивчити використання списків контролю доступу . Вони дозволяють набагато складніше контролювати привілеї.
Якщо ваш веб-сайт має складні вимоги, ви можете написати сценарій, який встановлює всі дозволи. Тестуйте його ретельно, а потім зберігайте. Це може вартувати ваги золота, якщо вам з якихось причин виникне необхідність відновити веб-сайт.