PLEASE
This commit is contained in:
commit
ea43703255
267
README.md
Normal file
267
README.md
Normal file
@ -0,0 +1,267 @@
|
|||||||
|
# I can kill your server by overloading your disk
|
||||||
|
## You dont have a firewall
|
||||||
|
## You dont have a VPN for your internal services
|
||||||
|
## You dont have a DMZ
|
||||||
|
## You are mixing your production deployment and your test deployment
|
||||||
|
|
||||||
|
# PLEASE Set up firewall so at least DRONE CI API isnt exposed
|
||||||
|
|
||||||
|
# Server & Deployment Security Hardening Guide
|
||||||
|
|
||||||
|
## Threat model (what we’re defending against)
|
||||||
|
|
||||||
|
* Disk exhaustion / resource exhaustion
|
||||||
|
* Direct access to internal services
|
||||||
|
* Lateral movement after compromise
|
||||||
|
* Accidental exposure of test systems
|
||||||
|
* No network segmentation or trust boundaries
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Network Segmentation (Non-Negotiable)
|
||||||
|
|
||||||
|
### Environments
|
||||||
|
|
||||||
|
**NEVER mix these on the same host or network segment:**
|
||||||
|
|
||||||
|
* Production
|
||||||
|
* Staging
|
||||||
|
* Test / Dev
|
||||||
|
|
||||||
|
**Minimum setup**
|
||||||
|
|
||||||
|
* Separate VMs or nodes
|
||||||
|
* Separate subnets/VPCs
|
||||||
|
* Separate credentials
|
||||||
|
* Separate databases
|
||||||
|
|
||||||
|
### Zones
|
||||||
|
|
||||||
|
* **Public zone**: Load balancer / reverse proxy only
|
||||||
|
* **DMZ**: Web servers
|
||||||
|
* **Internal zone**: Databases, queues, caches
|
||||||
|
* **Management zone**: SSH, monitoring, CI/CD
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. VPN for Internal Services
|
||||||
|
|
||||||
|
Internal services **must not be publicly routable**.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
|
||||||
|
* WireGuard (recommended)
|
||||||
|
* OpenVPN
|
||||||
|
* Cloud-native private networking (AWS VPC, GCP VPC, etc.)
|
||||||
|
|
||||||
|
**Rules**
|
||||||
|
|
||||||
|
* Databases listen on private IPs only
|
||||||
|
* Redis, Kafka, internal APIs → VPN or private subnet
|
||||||
|
* No public IPs for internal services
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Firewall Policy (IPtables)
|
||||||
|
|
||||||
|
### Firewall Philosophy
|
||||||
|
|
||||||
|
* **Default deny**
|
||||||
|
* Explicit allow
|
||||||
|
* Log drops (rate-limited)
|
||||||
|
* Stateful filtering
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. IPtables Baseline Configuration
|
||||||
|
|
||||||
|
### Flush existing rules
|
||||||
|
|
||||||
|
```bash
|
||||||
|
iptables -F
|
||||||
|
iptables -X
|
||||||
|
iptables -t nat -F
|
||||||
|
iptables -t mangle -F
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Default policies
|
||||||
|
|
||||||
|
```bash
|
||||||
|
iptables -P INPUT DROP
|
||||||
|
iptables -P FORWARD DROP
|
||||||
|
iptables -P OUTPUT ACCEPT
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Allow loopback
|
||||||
|
|
||||||
|
```bash
|
||||||
|
iptables -A INPUT -i lo -j ACCEPT
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Allow established connections
|
||||||
|
|
||||||
|
```bash
|
||||||
|
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### SSH (restricted)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
iptables -A INPUT -p tcp --dport 22 -s <YOUR_VPN_SUBNET>/24 -m conntrack --ctstate NEW -j ACCEPT
|
||||||
|
```
|
||||||
|
|
||||||
|
**Never expose SSH to the world.**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### HTTP / HTTPS
|
||||||
|
|
||||||
|
```bash
|
||||||
|
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT
|
||||||
|
iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Rate-limit connections (DDoS / abuse mitigation)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
iptables -A INPUT -p tcp --syn --dport 443 -m connlimit --connlimit-above 50 -j DROP
|
||||||
|
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 50 -j DROP
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Protect against SYN floods
|
||||||
|
|
||||||
|
```bash
|
||||||
|
iptables -A INPUT -p tcp ! --syn -m conntrack --ctstate NEW -j DROP
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### ICMP (limited)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
iptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 5 -j ACCEPT
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Log and drop everything else
|
||||||
|
|
||||||
|
```bash
|
||||||
|
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "IPTABLES DROP: "
|
||||||
|
iptables -A INPUT -j DROP
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Persist rules
|
||||||
|
|
||||||
|
```bash
|
||||||
|
iptables-save > /etc/iptables/rules.v4
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Disk Exhaustion Protection
|
||||||
|
|
||||||
|
### Enable disk quotas
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mount -o remount,usrquota,grpquota /
|
||||||
|
quotacheck -cum /
|
||||||
|
quotaon /
|
||||||
|
```
|
||||||
|
|
||||||
|
### Log rotation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
apt install logrotate
|
||||||
|
```
|
||||||
|
|
||||||
|
### Tmpfs for temp files
|
||||||
|
|
||||||
|
```bash
|
||||||
|
tmpfs /tmp tmpfs defaults,noexec,nosuid 0 0
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. Application-Level Protections
|
||||||
|
|
||||||
|
### Reverse proxy (mandatory)
|
||||||
|
|
||||||
|
* Nginx / HAProxy / Envoy
|
||||||
|
* Rate limiting
|
||||||
|
* Request body size limits
|
||||||
|
|
||||||
|
Example (Nginx):
|
||||||
|
|
||||||
|
```nginx
|
||||||
|
client_max_body_size 10M;
|
||||||
|
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Deployment Security Best Practices
|
||||||
|
|
||||||
|
### CI/CD
|
||||||
|
|
||||||
|
* No SSH deploys
|
||||||
|
* Use short-lived credentials
|
||||||
|
* One-way artifact promotion (build once → promote)
|
||||||
|
|
||||||
|
### Secrets
|
||||||
|
|
||||||
|
* Never in Git
|
||||||
|
* Use Vault / SSM / Secrets Manager
|
||||||
|
* Rotate regularly
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. OS Hardening
|
||||||
|
|
||||||
|
* Disable password SSH auth
|
||||||
|
* Use SSH keys only
|
||||||
|
* Fail2ban
|
||||||
|
* Automatic security updates
|
||||||
|
* Remove unused packages
|
||||||
|
* Run services as non-root
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. Monitoring & Alerting
|
||||||
|
|
||||||
|
You don’t have security if you don’t have visibility.
|
||||||
|
|
||||||
|
Monitor:
|
||||||
|
|
||||||
|
* Disk usage
|
||||||
|
* Connection counts
|
||||||
|
* Failed auth attempts
|
||||||
|
* Firewall drops
|
||||||
|
* CPU / memory saturation
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. Final Reality Check
|
||||||
|
|
||||||
|
If:
|
||||||
|
|
||||||
|
* You don’t have a firewall
|
||||||
|
* You don’t have segmentation
|
||||||
|
* You don’t have a VPN
|
||||||
|
* You mix prod and test
|
||||||
|
|
||||||
|
Then **you don’t have security — you have hope.**
|
||||||
Loading…
x
Reference in New Issue
Block a user