Apache HTTP Server'ı CentOS'a güvenli kurma
Yayın tarihi:
Güncelleme:
Teknik makaleler > Apache HTTP Server'ı CentOS'a güvenli kurma
2026 bağlamı ve güvenli kullanım
Sonuç: Desteklenen bir RHEL ailesi sunucuda paketlenmiş httpd sürümünü kurun. Reload öncesinde yapılandırmayı doğrulayın, yalnızca gerekli firewall servislerini açın ve SELinux'u kapatmak yerine doğru context ve boolean'ları kullanın.
Ne öğreneceksiniz
- Paket kurulumu, systemd başlangıcı, yapılandırma doğrulaması ve ağ erişiminin birlikte nasıl çalıştığı.
- Özel document root'ların dosya izinleri ve SELinux label'larıyla etkileşimi.
- Aşağıdaki hangi CentOS 7 komutları geçmişe yöneliktir ve desteklenen platform eşdeğerini gerektirir.
Kimler için: Temel bir Apache HTTP Server kuran veya eski bir CentOS runbook'unu güncelleyen Linux yöneticileri.
2026 bağlamı: CentOS 7 desteği sona ermiştir. Orijinal kılavuz yalnızca tarihsel referans olarak korunmaktadır. Güncel RHEL ve Apache belgelerini izleyin, SELinux'u enforcing modunda tutun, gereksiz modülleri kapatın ve graceful reload öncesinde apachectl configtest çalıştırın.
Güvenlik notu: Orijinal makaledeki komutlar ve yapılandırma örnekleri mevcut üretim ortamında yeniden çalıştırılmamıştır. Desteklenen sürümleri, yedeklemeleri, erişim kontrollerini ve geri alma adımlarını uygulamadan önce ayrı bir test ortamında doğrulayın.
Başlıca resmî kaynaklar
Genel bakış
Bu tarihsel rehber, Apache HTTP Server 2.4.6'nın CentOS 7.6 üzerinde nasıl kurulduğunu ve o dönemde kullanılan yapılandırmayı belgeler. Güncel bir üretim baseline'ı değildir.
Örnekte kullanılan sürümler:
| CentOS sürümü | 7.6 (1810) |
|---|---|
| Apache sürümü | 2.4.6 |
İçindekiler
1. Kurulum ve ilk test
Bu bölümdeki komutlar tarihsel CentOS 7 ortamına özgüdür.
1-1. Apache HTTP Server kurulumu
Orijinal ortamda httpd paketi yum ile root hesabından kurulmuştu.
[username@hostname ~]$ su -
[root@hostname ~]# yum -y install httpd
1-2. HTTP başlangıcını doğrulama
Kurulumdan sonra tarihsel örnekte apachectl ile servis başlatılmış ve durum kontrol edilmiştir.
[root@hostname ~]# apachectl start
[root@hostname ~]# apachectl status
* httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: active (running) since Sun 2020-12-06 17:08:12 JST; 1s ago
Docs: man:httpd(8)
man:apachectl(8)
Main PID: 1303 (httpd)
Status: "Processing requests..."
CGroup: /system.slice/httpd.service
|-1303 /usr/sbin/httpd -DFOREGROUND
|-1304 /usr/sbin/httpd -DFOREGROUND
|-1305 /usr/sbin/httpd -DFOREGROUND
|-1306 /usr/sbin/httpd -DFOREGROUND
|-1307 /usr/sbin/httpd -DFOREGROUND
`-1308 /usr/sbin/httpd -DFOREGROUND
Dec 06 17:08:11 localhost.localdomain systemd[1]: Starting The Apache HTTP Server...
Dec 06 17:08:12 localhost.localdomain httpd[1303]: AH00558: httpd: Could not reliably determ...ge
Dec 06 17:08:12 localhost.localdomain systemd[1]: Started The Apache HTTP Server.
Hint: Some lines were ellipsized, use -l to show in full.
apachectl status çıktısında “Active: active (running)” görülmesi httpd işleminin çalıştığını gösterir; yapılandırmanın ve dış erişimin doğru olduğunu tek başına kanıtlamaz.
Gerekli HTTP ve HTTPS servisleri firewalld içinde açılmıştır. Üretimde yalnızca gerçekten kullanılan servisleri ve güvenilir kaynakları açın; HTTPS yapılandırılmadan 443/tcp erişimi vermeyin.
[root@hostname ~]# firewall-cmd --permanent --add-service=http
[root@hostname ~]# firewall-cmd --permanent --add-service=https
[root@hostname ~]# firewall-cmd --reload
[root@hostname ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client http https ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
services satırında http ve https değerlerini doğrulayın. Örnek ortamda tarayıcıdan http://192.168.50.10 adresine erişilmiştir. Aşağıdaki test sayfası web sunucusuna ulaşıldığını gösterir.
İlk test tamamlandıktan sonra sonraki yapılandırma adımları için servis durdurulmuştur.
[root@hostname ~]# apachectl stop
2. Eski Apache yapılandırma adımları
2-1. Log klasörü oluşturma
Örnekte Apache logları için /var/log/httpd dizini kullanılmıştır.
Dizin sahibi, grup ve izinler dağıtımın çalışan kullanıcı modeline göre belirlenmelidir. Logların yetkisiz kullanıcılarca değiştirilememesi ve SELinux label'larının korunması gerekir.
'mkdir /var/log/httpd' komutunun, aynı isimde bir dizin zaten oluşturulmuşsa çalıştırılmasına gerek yoktur.
[root@hostname ~]# mkdir /var/log/httpd
[root@hostname ~]# chmod 755 /var/log/httpd
Bu adım yalnızca dizini oluşturur; log hedefleri daha sonra Apache yapılandırmasında tanımlanır.
2-2. Alan adı ayarı
ServerName değeri httpd.conf içinde yapılandırılır. Değeri gerçek alan adı ve dinleme portuyla eşleştirin; yerel test ortamında kullanılacak adı da DNS veya hosts yapılandırmasıyla tutarlı seçin.
[root@hostname ~]# vi /etc/httpd/conf/httpd.conf
Yorum işaretini kaldırın ve ServerName değerini ortama göre ayarlayın.
#ServerName www.example.com:80
ServerName domainname:80
2-3. SSL modüllerinin ve yapılandırma dosyalarının etkinleştirilmesi
HTTPS erişimi için TLS modülünü etkinleştirin. Kimlik bilgileri veya kişisel veri taşıyan trafiği şifrelenmemiş HTTP üzerinden sunmayın.
Tarihsel örnek mod_ssl paketini yum ile kurar.
[root@hostname ~]# yum -y install mod_ssl
Paket kurulumu modülü etkinleştirir ve /etc/httpd/conf.d/ssl.conf dosyasını oluşturur. Sertifika yollarını ve güvenlik ayarlarını ortama göre gözden geçirin.
2-4. Günlük çıktı yolunu değiştirme
Apache günlük çıktı hedefini yeni oluşturduğunuz günlük dosyası çıktı klasörü olarak değiştirin. Sadece ssl yapılandırma dosyasını değiştirin, çünkü sonraki bir adımda sadece ssl (https) üzerinden erişilecek şekilde ayarlanacaktır.
[root@hostname ~]# vi /etc/httpd/conf.d/ssl.conf
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
~KISALTMA~
CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
ErrorLog /var/log/httpd/ssl_error_log
TransferLog /var/log/httpd/ssl_access_log
~KISALTMA~
CustomLog /var/log/httpd/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
Yukarıdaki değişiklik günlük çıktı hedefini "/var/log/httpd" altına değiştirir.
'%t, %h', vb., bu günlük biçimlendirme ayarıdır. Aşağıda referans için sıkça kullanılabilecek formatların bir listesi bulunmaktadır.
Referans
• %T: Talebi işlemek için geçen süre (saniye)
• %h: İstemcinin ana bilgisayar adı veya IP adresi. Yalnızca HostnameLookups öğesi On olarak ayarlanmışsa ana bilgisayar adlarını çözümlemeye çalışın
• %r: Talebin ilk satırı
• %b: Yanıtın bayt sayısı (HTTP üstbilgileri hariç). CLF formatı, yani - baytların hiçbiri gönderilmezse
• %D: İsteği işlemek için geçen süre (mikrosaniye)
• %>s: HTTP Durumu
2-5. SSL sertifikalarının oluşturulması
Sertifika oluşturma prosedürü. Özel operasyonlar için kendi kendine belgelendirme uygundur. Halka açık sunucular için, kendi kendine sertifikasyon önerilmemelidir.
Self-signed sertifika şifreleme sağlayabilse de güven zinciri sunmaz; istemci sunucunun kimliğini güvenilir bir sertifika otoritesi üzerinden doğrulayamaz. Bu nedenle public sunucularda güvenilir bir CA tarafından düzenlenen ve alan adıyla eşleşen sertifika kullanın. Self-signed sertifikayı yalnızca kontrollü iç testlerde, fingerprint'i ayrı bir kanaldan doğrulayarak değerlendirin.
Apache için varsayılan sertifika ayarları "/etc/pki/tls/certs/localhost.crt" ve "/etc/pki/tls/private/localhost.key" şeklindedir.
Ayarlar "/etc/httpd/conf.d/ssl.conf" içindeki "SSLCertificateFile" ve "SSLCertificateKeyFile" içinde bulunabilir.
(Kendi kendine belgelendirme için)
Öz sertifika oluşturmak için aşağıdaki komutu çalıştırın. Kök kullanıcı olarak çalıştırın.
'openssl req -new -key /etc/pki/tls/private/localhost.key > /etc/pki/tls/certs/localhost.crt' komutunu çalıştırdığınızda sizden birkaç kez yanıt isteyecektir, hepsi Enter ile, sorun yok. Bu, sertifikayı kimin verdiğine ilişkin bilgiler olacaktır (örneğin, hangi ülkede yaşadıkları ve e-posta adreslerinin ne olduğu). Normal bir sertifika düzenliyorsanız, doğru bilgileri girin ve ayarlayın.
[root@hostname ~]# openssl genrsa > /etc/pki/tls/private/localhost.key
[root@hostname ~]# openssl req -new -key /etc/pki/tls/private/localhost.key > /etc/pki/tls/certs/localhost.csr
[root@hostname ~]# openssl x509 -req -signkey /etc/pki/tls/private/localhost.key < /etc/pki/tls/certs/localhost.csr > /etc/pki/tls/certs/localhost.crt
(Normal sertifikalar için)
Normal bir sertifika oluşturmak için aşağıdaki komutu çalıştırın. Kök kullanıcı olarak çalıştırın.
[root@hostname ~]# openssl genrsa -out /etc/pki/tls/private/localhost.key 2048
[root@hostname ~]# openssl req -new -key /etc/pki/tls/private/localhost.key -out /etc/pki/tls/certs/localhost.csr
Normal sertifikalar için bu işlemin tamamlanması yeterli değildir. Çalışma, oluşturulan 'server.csr' dosyasını bir sunucu sertifikası düzenlenmesi için Sertifika Yetkilisine teslim etmeyi ve düzenlenen sunucu sertifikasını yüklemeyi içerir.
2-6. HTTP'den HTTPS'ye yönlendirme
HTTP isteğini HTTPS'ye yönlendirmek için tarihsel örnekte mod_rewrite kuralı eklenmiştir.
Yönlendirme kuralını proxy ve host header mimarisiyle birlikte test edin; güvenilmeyen Host değerini doğrulamadan redirect hedefinde kullanmak risk oluşturabilir. Aşağıdaki eski adımlar root hesabıyla uygulanmıştır.
[root@hostname ~]# vi /etc/httpd/conf/httpd.conf
Sonuna aşağıdakileri ekleyin.
<IfModule rewrite_module>
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
Bu ayarı http ile gelen erişimlerin https ile işlenmesini sağlayacak şekilde değiştirmek mümkündür.
Eğer https üzerinden gelirseniz bu ayarın çalışmadığı belirtiliyor. (RewriteCond %{HTTPS} off)
Bu ayar olmadan https erişimlerinin de yönlendirileceğini ve sonsuz bir döngüye neden olacağını belirtmeyi unutmayın.
2-7. HTTPS erişimini doğrulama
Yapılandırmayı kontrol ettikten sonra servisi başlatın ve HTTPS erişimini doğrulayın.
[root@hostname ~]# apachectl start
Örnek ortamda http://192.168.50.10 adresine erişilir.
Yönlendirme doğru çalışıyorsa tarayıcı https://192.168.50.10 adresine geçer. Sertifikanın alan adı, güven zinciri ve geçerlilik süresini ayrıca doğrulayın.
Artık başarıyla başlatıldığına göre Apache'yi durdurun.
[root@hostname ~]# apachectl stop
2-8. Otomatik başlatma ayarı
Aşağıdaki adımlar, CentOS 7 döneminde özel bir apache.service dosyası oluşturulan tarihsel örnektir. Güncel paketler genellikle hazır httpd.service unit'i sağlar; yeni bir unit oluşturmadan önce dağıtımın sağladığı servisi kullanın.
Bir 'apache.service' dosyası oluşturun ve gerekli ayarları tanımlayın.
[root@hostname ~]# touch /etc/systemd/system/apache.service
[root@hostname ~]# vi /etc/systemd/system/apache.service
Aşağıdaki bilgiler verilmiştir.
[Unit]
#Açıklama.
Description=Apache
#Yürütme öncesi ve sonrası kontrol.
#Before=xxx.service
#After=xxx.service
[Service]
#Kullanıcı ve grup tanımlama
User=root
Group=root
#Etkinleştirildikten sonra durumu Etkinleştirildi olarak ayarlayın.
Type=oneshot
RemainAfterExit=yes
#Başlat, durdur ve yeniden yükle.
ExecStart=/usr/sbin/apachectl start
ExecStop=/usr/sbin/apachectl stop
ExecReload=/usr/sbin/apachectl restart
[Install]
#Çalışma seviyesi 3 eşdeğer ayarları.
WantedBy=multi-user.target
Tanımlamayı bitirdiğinizde, systemctl komutu ile kaydedin.
[root@hostname ~]# systemctl enable apache
[root@hostname ~]# systemctl is-enabled apache
enabled
[root@hostname ~]# systemctl list-unit-files --type=service | grep apache
apache.service enabled
[root@hostname ~]# systemctl daemon-reload
3. Özet
Bu sayfa CentOS 7 dönemindeki Apache kurulumunu belgeler. Güncel üretim sisteminde desteklenen paketleri ve resmî systemd unit'ini kullanın; configtest, firewall, SELinux, güvenilir TLS sertifikası, log izinleri ve rollback planını birlikte doğrulayın.
