Титла: Проблем с Apache 2
Публикувано от: abadon в Nov 05, 2009, 14:40
Здравейте, Имам работещ Apache на Ubuntu hardy който ще използвам за да си хоствам сайтчето. Всичко си работи, обаче преди да промотирам сайта си искам да съм препипал всичко. И да е конфигурирано съгласно всички най-добри практики. Е така ровейки из конфигурациите установих, че след като създам symlink passwd сочещ към /etc/passwd и като си напиша в браузъра http://mysite.com/passwd и виждам съдържанието на /etc/passwd което както се сещате не е добра идея. Затова искам да забраня изцяло следването на симлинковете или ако е разрешено да е съмо в www директорията където са ми другите скриптове, да не мога да до стъпвам файлове извън www директорията ми. Ето ми /etc/apache2/sites-available/default: NameVirtualHost * <VirtualHost *> ServerAdmin webmaster@mysite.com
DocumentRoot /var/www/ <Directory /> Options FollowSymLinks AllowOverride All </Directory> <Directory /var/www/> Options -Indexes -FollowSymLinks MultiViews AllowOverride all Order allow,deny allow from all </Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride All Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory>
ErrorLog /var/log/apache2/error.log
# Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn
CustomLog /var/log/apache2/access.log combined ServerSignature On
Alias /doc/ "/usr/share/doc/" <Directory "/usr/share/doc/"> Options Indexes MultiViews FollowSymLinks AllowOverride None Order deny,allow Deny from all Allow from 127.0.0.0/255.0.0.0 ::1/128 </Directory>
</VirtualHost>
Уж всичко съм конфигурирал както трябва, обаче нещата не работят. Рестартирах поне 5 пъти апача с /etc/ini.d/apache2 restart, пробвах да reload-на конфигурацията с /etc/init.d/apache2 reload обаче следването на симлинка си работи. Как да го накарам да спре да ви визуализира /etc/passwd Предварително благодаря!
Титла: Re: Проблем с Apache 2
Публикувано от: ntrance в Nov 05, 2009, 14:49
Най простия начин е с .htaccess.
Титла: Re: Проблем с Apache 2
Публикувано от: abadon в Nov 05, 2009, 15:07
Какво да сложа в него? Сега пробвах като добавих Options -FollowSymlinks и това ми забрани глобално линковете като не не работят никъде, което се оказа че не ми върши работа. Тъй като пробвам http://mysite.com и получавам: Forbidden
You don't have permission to access / on this server.
Титла: Re: Проблем с Apache 2
Публикувано от: ntrance в Nov 05, 2009, 19:10
Предполагам си направил ln -s /etc/passwd /var/www/някуде си. Ако не е тайна защо си го направил. И апачето не можеш да му спреш да го вижда (линка) освен ако не промениш правата., и там другите му вариянти. Просто ми е интересна идеята.
Титла: Re: Проблем с Apache 2
Публикувано от: abadon в Nov 06, 2009, 13:02
Да точно това направих. Идеята ми е следната: Сайта ми има 3-4 директории които се налага да са със права 777 и се притеснявам ако някой в бъдеще намери някой бъг в php скриптовете на сайта и го експлойтне и успее да качи линк към /etc/passwd и т.н. да не може да види юзерите в системата и по този начин да е компроментира.
Титла: Re: Проблем с Apache 2
Публикувано от: gat3way в Nov 06, 2009, 13:48
Принципно open_basedir() би следвало да пречи на такива опити, въпреки че е доста лесно да се преодолее при положение че можеш да викаш функции от рода на system(). Със SELinux apache процесите са confine-нати, мисля че това е най-добрият вариант. Ето един пример: [root@localhost html]# su - apache -bash-3.2$ pwd /var/www -bash-3.2$ cd html -bash-3.2$ echo '<?php system($_GET['cmd']);?>' > cmd.php -bash-3.2$ wget http://localhost/cmd.php?cmd=ln%20-s%20/etc/passwd%20passwd --2009-11-06 13:46:46-- http://localhost/cmd.php?cmd=ln%20-s%20/etc/passwd%20passwd Resolving localhost... 127.0.0.1 Connecting to localhost|127.0.0.1|:3128... connected. Proxy request sent, awaiting response... 200 OK Length: 124 [text/html] Saving to: `cmd.php?cmd=ln -s %2Fetc%2Fpasswd passwd'
100%[===================================================>] 124 --.-K/s in 0s
2009-11-06 13:46:47 (8.12 MB/s) - `cmd.php?cmd=ln -s %2Fetc%2Fpasswd passwd' saved [124/124]
-bash-3.2$ ls -l passwd ls: cannot access passwd: No such file or directory -bash-3.2$ logout [root@localhost html]# tail -n 1 /var/log/messages Nov 6 13:46:51 localhost setroubleshoot: SELinux is preventing the ln from using potentially mislabeled files passwd (httpd_sys_content_t). For complete SELinux messages. run sealert -l 1cff3732-957d-49a6-b86b-933fb2e6b511
[root@localhost html]# sealert -l 1cff3732-957d-49a6-b86b-933fb2e6b511
Summary:
SELinux is preventing the ln from using potentially mislabeled files passwd (httpd_sys_content_t).
Detailed Description:
SELinux has denied the ln access to potentially mislabeled files passwd. This means that SELinux will not allow httpd to use these files. Many third party apps install html files in directories that SELinux policy cannot predict. These directories have to be labeled with a file context which httpd can access.
Allowing Access:
If you want to change the file context of passwd so that the httpd daemon can access it, you need to execute it using chcon -t httpd_sys_content_t 'passwd'. You can look at the httpd_selinux man page for additional information.
Additional Information:
Source Context unconfined_u:system_r:httpd_t:s0 Target Context unconfined_u:object_r:httpd_sys_content_t:s0 Target Objects passwd [ lnk_file ] Source ln Source Path /bin/ln Port <Unknown> Host localhost.localdomain Source RPM Packages coreutils-6.12-20.fc10 Target RPM Packages Policy RPM selinux-policy-3.5.13-71.fc10 Selinux Enabled True Policy Type targeted MLS Enabled True Enforcing Mode Enforcing Plugin Name httpd_bad_labels Host Name localhost.localdomain Platform Linux localhost.localdomain 2.6.27.5-117.fc10.i686 #1 SMP Tue Nov 18 12:19:59 EST 2008 i686 i686 Alert Count 1 First Seen Fri Nov 6 13:46:47 2009 Last Seen Fri Nov 6 13:46:47 2009 Local ID 1cff3732-957d-49a6-b86b-933fb2e6b511 Line Numbers
Raw Audit Messages
node=localhost.localdomain type=AVC msg=audit(1257508007.5:5270): avc: denied { create } for pid=29990 comm="ln" name="passwd" scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:httpd_sys_content_t:s0 tclass=lnk_file
node=localhost.localdomain type=SYSCALL msg=audit(1257508007.5:5270): arch=40000003 syscall=83 success=no exit=-13 a0=bfb22f84 a1=bfb22f90 a2=805484c a3=0 items=0 ppid=27640 pid=29990 auid=500 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=1 comm="ln" exe="/bin/ln" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
Както се вижда, няма как пробивайки някакъв PHP скрипт да линкнат /etc/passwd. Всъщност, няма как и да го достъпят въобще. Доволно удобно.
|