Konfigurasi Keamanan
Konfigurasi Keamanan XOOPS
Section titled “Konfigurasi Keamanan XOOPS”Panduan komprehensif untuk mengamankan instalasi XOOPS Anda dari kerentanan web umum.
Daftar Periksa Keamanan
Section titled “Daftar Periksa Keamanan”Sebelum meluncurkan situs Anda, terapkan langkah-langkah keamanan berikut:
- Izin file diatur dengan benar (644/755)
- Folder instalasi dihapus atau dilindungi
- mainfile.php dilindungi dari modifikasi
- SSL/HTTPS diaktifkan di semua halaman
- Folder Admin diganti namanya atau dilindungi
- File sensitif tidak dapat diakses web
- Pembatasan .htaccess berlaku
- Pencadangan rutin otomatis
- Header keamanan dikonfigurasi
- Perlindungan CSRF diaktifkan
- Perlindungan injeksi SQL aktif
- Modules/extensions diperbarui
Keamanan Sistem File
Section titled “Keamanan Sistem File”Izin Berkas
Section titled “Izin Berkas”Izin file yang tepat sangat penting untuk keamanan.
Pedoman Izin
Section titled “Pedoman Izin”| Jalur | Izin | Pemilik | Alasan |
|---|---|---|---|
| mainfile.php | 644 | akar | Berisi kredensial DB |
| *.file php | 644 | akar | Mencegah modifikasi yang tidak sah |
| Direktori | 755 | akar | Bolehkan membaca, cegah menulis |
| tembolok/ | 777 | www-data | Server web harus menulis |
| templat_c/ | 777 | www-data | template yang dikompilasi |
| unggahan/ | 777 | www-data | Unggahan pengguna |
| var/ | 777 | www-data | Data variabel |
| pasang/ | Hapus | - | Hapus setelah instalasi |
| konfigurasi/ | 755 | akar | Dapat dibaca, tidak dapat ditulis |
Mengatur Skrip Izin
Section titled “Mengatur Skrip Izin”#!/bin/bashXOOPS_PATH="/var/www/html/xoops"WEB_USER="www-data"
# Set ownershipecho "Setting ownership..."chown -R $WEB_USER:$WEB_USER $XOOPS_PATH
# Set restrictive default permissionsecho "Setting base permissions..."find $XOOPS_PATH -type d -exec chmod 755 {} \;find $XOOPS_PATH -type f -exec chmod 644 {} \;
# Make specific directories writableecho "Setting writable directories..."chmod 777 $XOOPS_PATH/cachechmod 777 $XOOPS_PATH/templates_cchmod 777 $XOOPS_PATH/uploadschmod 777 $XOOPS_PATH/var
# Protect sensitive filesecho "Protecting sensitive files..."chmod 644 $XOOPS_PATH/mainfile.phpchmod 444 $XOOPS_PATH/mainfile.php.dist # If it exists (read-only)
# Verify permissionsecho "Verifying permissions..."ls -la $XOOPS_PATH | grep -E "mainfile|cache|uploads|var|templates_c"
echo "Security hardening completed!"Jalankan skrip:
chmod +x /usr/local/bin/xoops-secure.sh/usr/local/bin/xoops-secure.shHapus Folder Instalasi
Section titled “Hapus Folder Instalasi”KRITIS: Folder instalasi harus dihapus setelah instalasi!
# Option 1: Delete completelyrm -rf /var/www/html/xoops/install/
# Option 2: Rename and keep for referencemv /var/www/html/xoops/install/ /var/www/html/xoops/install.bak/
# Verify removalls -la /var/www/html/xoops/ | grep installLindungi Direktori Sensitif
Section titled “Lindungi Direktori Sensitif”Buat file .htaccess untuk memblokir akses web ke folder sensitif:
Berkas: /var/www/html/xoops/var/.htaccess
<FilesMatch "\.(php|phtml|php3|php4|php5|php6|php7|phps|pht|phar)$"> Deny from all</FilesMatch>
<IfModule mod_autoindex.c> Options -Indexes</IfModule>Berkas: /var/www/html/xoops/templates_c/.htaccess
<FilesMatch "\.(php|phtml|php3|php4|php5|php6|php7|phps|pht|phar)$"> Deny from all</FilesMatch>
Options -IndexesBerkas: /var/www/html/xoops/cache/.htaccess
Options -Indexes<FilesMatch "\.(php|phtml|php3|php4|php5|php6|php7)$"> Deny from all</FilesMatch>Lindungi Direktori Upload
Section titled “Lindungi Direktori Upload”Cegah eksekusi skrip dalam unggahan:
Berkas: /var/www/html/xoops/uploads/.htaccess
# Prevent script execution<FilesMatch "\.(php|phtml|php3|php4|php5|php6|php7|phps|pht|phar|pl|py|jsp|asp|aspx|cgi|sh|bat|exe)$"> Deny from all</FilesMatch>
# Prevent directory listingOptions -Indexes
# Additional protection<IfModule mod_rewrite.c> RewriteEngine On RewriteBase /xoops/uploads/
# Block suspicious files RewriteCond %{REQUEST_URI} \.(php|phtml|php3|php4|php5|php6|php7)$ [NC] RewriteRule ^.*$ - [F,L]</IfModule>Konfigurasi SSL/HTTPS
Section titled “Konfigurasi SSL/HTTPS”Enkripsi semua lalu lintas antara pengguna dan server Anda.
Dapatkan Sertifikat SSL
Section titled “Dapatkan Sertifikat SSL”Opsi 1: Sertifikat Gratis dari Let’s Encrypt
# Install Certbotapt-get install certbot python3-certbot-apache
# Obtain certificate (auto-configures Apache)certbot certonly --apache -d your-domain.com -d www.your-domain.com
# Verify certificate installedls /etc/letsencrypt/live/your-domain.com/Opsi 2: Sertifikat SSL Komersial
Hubungi penyedia atau registrar SSL:
- Beli sertifikat SSL
- Verifikasi kepemilikan domain
- Instal file sertifikat di server
- Konfigurasikan server web
Konfigurasi Apache SSL
Section titled “Konfigurasi Apache SSL”Buat host virtual HTTPS:
Berkas: /etc/apache2/sites-available/xoops-ssl.conf
<VirtualHost *:443> ServerName your-domain.com ServerAlias www.your-domain.com DocumentRoot /var/www/html/xoops
# SSL Configuration SSLEngine on SSLProtocol TLSv1.2 TLSv1.3 SSLCipherSuite HIGH:!aNULL:!MD5 SSLCertificateFile /etc/letsencrypt/live/your-domain.com/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/your-domain.com/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/your-domain.com/chain.pem
# Security Headers Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" Header always set X-Content-Type-Options "nosniff" Header always set X-Frame-Options "SAMEORIGIN" Header always set X-XSS-Protection "1; mode=block" Header always set Referrer-Policy "no-referrer-when-downgrade" Header always set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'"
<Directory /var/www/html/xoops> Options -Indexes +FollowSymLinks AllowOverride All Require all granted </Directory>
# Restrict install folder <Directory /var/www/html/xoops/install> Deny from all </Directory>
# Logging ErrorLog ${APACHE_LOG_DIR}/xoops_ssl_error.log CustomLog ${APACHE_LOG_DIR}/xoops_ssl_access.log combined</VirtualHost>
# Redirect HTTP to HTTPS<VirtualHost *:80> ServerName your-domain.com ServerAlias www.your-domain.com Redirect 301 / https://your-domain.com/</VirtualHost>Aktifkan konfigurasi:
# Enable SSL modulea2enmod ssl
# Enable sitea2ensite xoops-ssl
# Disable non-SSL site if existsa2dissite 000-default
# Test configurationapache2ctl configtest# Should output: Syntax OK
# Restart Apachesystemctl restart apache2Konfigurasi SSL Nginx
Section titled “Konfigurasi SSL Nginx”Berkas: /etc/nginx/sites-available/xoops
# HTTP to HTTPS redirectserver { listen 80; listen [::]:80; server_name your-domain.com www.your-domain.com;
location / { return 301 https://$server_name$request_uri; }}
# HTTPS serverserver { listen 443 ssl http2; listen [::]:443 ssl http2;
server_name your-domain.com www.your-domain.com; root /var/www/html/xoops; index index.php index.html;
# SSL Certificate Configuration ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
# Modern SSL Configuration ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m;
# HSTS Header add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# Security Headers add_header X-Content-Type-Options "nosniff" always; add_header X-Frame-Options "SAMEORIGIN" always; add_header X-XSS-Protection "1; mode=block" always; add_header Referrer-Policy "no-referrer-when-downgrade" always; add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'" always;
# Restrict install folder location ~ ^/(install|upgrade)/ { deny all; }
# Deny access to sensitive files location ~ /\. { deny all; }
# PHP-FPM back-end location ~ \.php$ { fastcgi_pass unix:/run/php-fpm.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; }
# Static files caching location ~* \.(js|css|png|jpg|gif|ico|svg)$ { expires 30d; add_header Cache-Control "public, immutable"; }
# URL rewriting location / { try_files $uri $uri/ /index.php?$query_string; }
# Logging access_log /var/log/nginx/xoops_access.log; error_log /var/log/nginx/xoops_error.log;}Aktifkan konfigurasi:
ln -s /etc/nginx/sites-available/xoops /etc/nginx/sites-enabled/nginx -tsystemctl restart nginxVerifikasi Instalasi HTTPS
Section titled “Verifikasi Instalasi HTTPS”# Test SSL configurationopenssl s_client -connect your-domain.com:443 -tls1_2
# Check certificate validityopenssl x509 -in /etc/letsencrypt/live/your-domain.com/cert.pem -noout -text
# SSL/TLS test online# https://www.ssllabs.com/ssltest/# https://www.testssl.sh/Perpanjangan Otomatis Mari Enkripsi Sertifikat
Section titled “Perpanjangan Otomatis Mari Enkripsi Sertifikat”# Enable auto-renewalsystemctl enable certbot.timersystemctl start certbot.timer
# Test renewal processcertbot renew --dry-run
# Manual renewal if neededcertbot renew --force-renewalKeamanan Aplikasi Web
Section titled “Keamanan Aplikasi Web”Melindungi Terhadap Injeksi SQL
Section titled “Melindungi Terhadap Injeksi SQL”XOOPS menggunakan kueri berparameter (aman secara default), tetapi selalu:
// UNSAFE - Never do this!$query = "SELECT * FROM users WHERE name = '" . $_GET['name'] . "'";
// SAFE - Use prepared statements$database = XoopsDatabaseFactory::getDatabaseConnection();$sql = "SELECT * FROM " . $database->prefix('users') . " WHERE name = ?";$result = $database->query($sql, array($_GET['name']));Pencegahan Skrip Lintas Situs (XSS)
Section titled “Pencegahan Skrip Lintas Situs (XSS)”Selalu bersihkan masukan pengguna:
// UNSAFEecho $_GET['user_input'];
// SAFE - Use XOOPS sanitization functionsecho htmlspecialchars($_GET['user_input'], ENT_QUOTES, 'UTF-8');
// Or use XOOPS functions$text_sanitizer = new xoops_text_sanitizer();echo $text_sanitizer->stripSlashesGPC($_GET['user_input']);Pencegahan Pemalsuan Permintaan Lintas Situs (CSRF)
Section titled “Pencegahan Pemalsuan Permintaan Lintas Situs (CSRF)”XOOPS menyertakan perlindungan token CSRF. Selalu sertakan token:
<!-- In forms --><form method="post"> {xoops_token form=update} <input type="text" name="field"> <input type="submit"></form>Nonaktifkan Eksekusi PHP di Folder Unggah
Section titled “Nonaktifkan Eksekusi PHP di Folder Unggah”Cegah penyerang mengunggah dan mengeksekusi PHP:
# Create .htaccess in uploads foldercat > /var/www/html/xoops/uploads/.htaccess << 'EOF'<FilesMatch "\.(php|phtml|php3|php4|php5|php6|php7)$"> Deny from all</FilesMatch>php_flag engine offEOF
# Alternative: Disable execution globally in uploadschmod 444 /var/www/html/xoops/uploads/ # Read-onlyHeader Keamanan
Section titled “Header Keamanan”Konfigurasikan header keamanan HTTP penting:
# Strict-Transport-Security (HSTS)# Forces HTTPS for 1 yearHeader always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
# X-Content-Type-Options# Prevents MIME type sniffingHeader always set X-Content-Type-Options "nosniff"
# X-Frame-Options# Prevents clickjacking attacksHeader always set X-Frame-Options "SAMEORIGIN"
# X-XSS-Protection# Browser XSS protectionHeader always set X-XSS-Protection "1; mode=block"
# Referrer-Policy# Controls referrer informationHeader always set Referrer-Policy "strict-origin-when-cross-origin"
# Content-Security-Policy# Controls resource loadingHeader always set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self'"Keamanan Panel Admin
Section titled “Keamanan Panel Admin”Ganti nama Folder Admin
Section titled “Ganti nama Folder Admin”Lindungi folder admin dengan mengganti namanya:
# Rename admin foldermv /var/www/html/xoops/admin /var/www/html/xoops/myadmin123
# Update admin access URL# Old: http://your-domain.com/xoops/admin/# New: http://your-domain.com/xoops/myadmin123/Konfigurasikan XOOPS untuk menggunakan folder yang diganti namanya:
Sunting mainfile.php:
// Change this linedefine('XOOPS_ADMIN_PATH', '/var/www/html/xoops/myadmin123');Daftar Putih IP untuk Admin
Section titled “Daftar Putih IP untuk Admin”Batasi akses admin ke IP tertentu:
Berkas: /var/www/html/xoops/myadmin123/.htaccess
# Allow only specific IPs<RequireAll> Require ip 192.168.1.100 # Your office IP Require ip 203.0.113.50 # Your home IP Deny from all</RequireAll>Atau dengan Apache 2.2:
Order Deny,AllowDeny from allAllow from 192.168.1.100 203.0.113.50Kredensial Admin yang Kuat
Section titled “Kredensial Admin yang Kuat”Terapkan kata sandi yang kuat untuk administrator:1. Gunakan minimal 16 karakter 2. Campur huruf besar, huruf kecil, angka, simbol 3. Ganti password secara berkala (setiap 90 hari) 4. Gunakan pengelola kata sandi 5. Aktifkan otentikasi dua faktor jika tersedia
Pantau Aktivitas Admin
Section titled “Pantau Aktivitas Admin”Aktifkan pencatatan login admin:
Panel Admin > Sistem > Preferensi > Pengaturan Pengguna
Log Admin Logins: YesLog Failed Login Attempts: YesAlert Email on Admin Login: YesTinjau log secara teratur:
# Check database for login attemptsmysql -u xoops_user -p xoops_db << EOFSELECT uid, uname, DATE_FROM_UNIXTIME(user_lastlogin) as last_loginFROM xoops_users WHERE uid = 1;EOFPerawatan Reguler
Section titled “Perawatan Reguler”Perbarui XOOPS dan module
Section titled “Perbarui XOOPS dan module”Selalu perbarui XOOPS dan semua module:
# Check for updates in admin panel# Admin > Modules > Check for Updates
# Or via command linecd /var/www/html/xoops# Download and install latest version# Follow upgrade guidePemindaian Keamanan Otomatis
Section titled “Pemindaian Keamanan Otomatis”#!/bin/bash# Security audit script
# Check file permissionsecho "Checking file permissions..."find /var/www/html/xoops -type f ! -perm 644 ! -name "*.htaccess" | head -10
# Check for suspicious filesecho "Checking for suspicious files..."find /var/www/html/xoops -type f -name "*.php" -newer /var/www/html/xoops/install/ 2>/dev/null
# Check database for suspicious activityecho "Checking for failed login attempts..."mysql -u xoops_user -p xoops_db << EOFSELECT count(*) as attempts FROM xoops_audittrail WHERE action LIKE '%login%' AND status = 0;EOFPencadangan Reguler
Section titled “Pencadangan Reguler”Otomatiskan pencadangan harian:
#!/bin/bash# Daily backup script
BACKUP_DIR="/backups/xoops"RETENTION=30 # Keep 30 days
# Backup databasemysqldump -u xoops_user -p xoops_db | gzip > $BACKUP_DIR/db_$(date +%Y%m%d).sql.gz
# Backup filestar -czf $BACKUP_DIR/files_$(date +%Y%m%d).tar.gz /var/www/html/xoops --exclude=cache --exclude=templates_c
# Remove old backupsfind $BACKUP_DIR -type f -mtime +$RETENTION -delete
echo "Backup completed at $(date)"Jadwalkan dengan cron:
# Edit crontabcrontab -e
# Add line (runs daily at 2 AM)0 2 * * * /usr/local/bin/xoops-backup.sh >> /var/log/xoops_backup.log 2>&1template Daftar Periksa Keamanan
Section titled “template Daftar Periksa Keamanan”Gunakan template ini untuk audit keamanan rutin:
Weekly Security Checklist========================
Date: ___________Checked by: ___________
File System:[ ] Permissions correct (644/755)[ ] Install folder removed[ ] No suspicious files[ ] mainfile.php protected
Web Security:[ ] HTTPS/SSL working[ ] Security headers present[ ] Admin panel restricted[ ] File upload restrictions active[ ] Login attempts logged
Application:[ ] XOOPS version current[ ] All modules updated[ ] No error messages in logs[ ] Database optimized[ ] Cache cleared
Backups:[ ] Database backed up[ ] Files backed up[ ] Backup tested[ ] Offsite copy verified
Issues Found:1. ___________2. ___________3. ___________
Actions Taken:1. ___________2. ___________Sumber Daya Keamanan
Section titled “Sumber Daya Keamanan”- Persyaratan Server
- Konfigurasi Dasar
- Optimasi Kinerja
- OWASP 10 Teratas: https://owasp.org/www-project-top-ten/
Tag: #keamanan #ssl #https #pengerasan #praktik terbaik
Artikel Terkait:
- ../Installation/Installation
- ../../06-Publisher-Module/User-Guide/Basic-Configuration
- Pengaturan Sistem
- ../Installation/Upgrading-XOOPS