ขั้นตอนในการรักษาความปลอดภัย VPS ของเรา

บทช่วยสอนนี้แสดงวิธีเตรียมและรักษาความปลอดภัย Virtual Private Server (VPS) ด้วย Debian GNU / Linux ก่อนที่เราจะเริ่มมีการสันนิษฐานบางอย่าง:

  1. คุณมีความคุ้นเคยกับ GNU / Linux ระดับกลาง
  2. มี VPS สำหรับการใช้งานส่วนตัวที่เราเข้าถึงผ่าน SSH
  3. VPS มี ipv4 ภายนอกเฉพาะ 250.250.250.155 และผู้ให้บริการของเราเป็นเจ้าของบล็อก 250.250.0.0/16 (1)
  4. ใน VPS ของเราเราจะเปิดใช้บริการ http, https และ ssh สำหรับการเข้าถึงจากภายนอกเท่านั้น
  5. DNS ภายนอกจะไม่ถูกเปิดใช้งานเนื่องจากโดยปกติจะทำในแผงควบคุมของผู้ให้บริการของเรา (2)
  6. มันจะทำงานเป็น superuser

การติดตั้ง

ในขั้นตอนแรกเรามาอัปเดตเซิร์ฟเวอร์และติดตั้งแพ็คเกจบางอย่างที่เราต้องการ:

# aptitude update & aptitude safe-upgrade # aptitude -RvW install dropbear gesftpserver sslh iptables-persistent ulogd fail2ban nginx-light apache2-utils dnsutils telnet ghostscript poppler-utils zip unzip unrar-free p7zip-full less multitail tee mc

องค์ประกอบ

ตอนนี้เรากำลังจะสร้างผู้ใช้งาน การทำงานเป็นรูทบนเซิร์ฟเวอร์นั้นไม่ปลอดภัยดังนั้นก่อนอื่นเราจะสร้างผู้ใช้พิเศษ:

ตัวดำเนินการ adduser usermod -aG sudo operator

คำสั่งแรกสร้างผู้ใช้ตัวดำเนินการคำสั่งที่สองจะเพิ่มเข้าในกลุ่ม sudoซึ่งจะอนุญาตให้รันแอปพลิเคชันในฐานะรูท

ปรับการอนุญาตสำหรับผู้ใช้ขั้นสูง

ในการทำงานประจำเราจะใช้ผู้ใช้ ผู้ประกอบการ สร้างไว้ก่อนหน้านี้เราจำเป็นต้องปรับตัวเลือกการดำเนินการคำสั่งเป็น superuser ซึ่งเราดำเนินการคำสั่งต่อไปนี้:

visudo

คำสั่งนี้โดยทั่วไปอนุญาตให้แก้ไขไฟล์ / etc / sudoers; ซึ่งเราควรมีบรรทัดเหล่านี้:

ค่าเริ่มต้น env_reset, timestamp_timeout = 0% sudo ALL = (ALL: ALL) ALL

ในบรรทัดแรกตัวเลือกจะถูกเพิ่มเข้าไปในค่าเริ่มต้น การประทับเวลา_หมดเวลา ซึ่งช่วยให้คุณตั้งเวลาหมดอายุ (เป็นนาที) ของรหัสผ่านเมื่อคำสั่ง sudo ถูกเรียกใช้งาน ค่าเริ่มต้นคือ 5 แต่บางครั้งอาจไม่ปลอดภัยด้วยเหตุผลสองประการ:

  1. หากเราปล่อยให้คอมพิวเตอร์ของเราล็อกอินโดยไม่ได้ตั้งใจก่อนที่รหัสผ่านจะหมดอายุใครบางคนสามารถเรียกใช้คำสั่งในฐานะรูทได้โดยไม่มีข้อ จำกัด ใด ๆ
  2. หากเราเรียกใช้แอปพลิเคชันหรือสคริปต์ที่มีรหัสที่เป็นอันตรายก่อนที่รหัสผ่านจะหมดอายุด้วยความไม่รู้แอปพลิเคชันอาจเข้าถึงระบบของเราในฐานะผู้ใช้ขั้นสูงโดยไม่ได้รับความยินยอมอย่างชัดเจน

ดังนั้นเพื่อหลีกเลี่ยงความเสี่ยงเราจึงตั้งค่าเป็นศูนย์นั่นคือทุกครั้งที่เรียกใช้คำสั่ง sudo จะต้องป้อนรหัสผ่าน หากตั้งค่าลบเป็น -1 ผลคือรหัสผ่านจะไม่มีวันหมดอายุซึ่งจะให้ผลลัพธ์ที่ตรงกันข้ามกับสิ่งที่เราต้องการ

ในบรรทัดที่สองมีการชี้แจงว่ากลุ่ม sudo สามารถดำเนินการคำสั่งใด ๆ บนคอมพิวเตอร์เครื่องใดก็ได้ซึ่งตามปกติแม้ว่าจะสามารถปรับเปลี่ยนได้ (3) มีผู้เพื่อความสะดวกวางบรรทัดดังนี้เพื่อหลีกเลี่ยงการพิมพ์รหัสผ่าน:

% sudo ALL = (ทั้งหมด: ทั้งหมด) NOPASSWD: ทั้งหมด

อย่างไรก็ตามตามที่เราได้อธิบายไปก่อนหน้านี้มีความเสี่ยงดังนั้นจึงไม่แนะนำ

ปิดการรีสตาร์ท

เพื่อความปลอดภัยเราจะปิดการรีสตาร์ทโดยใช้คีย์ผสม Ctrl + Alt + Delซึ่งเราต้องเพิ่มบรรทัดนี้ในไฟล์ / etc / inittab:

ca: 12345: ctrlaltdel: / bin / echo "Ctrl + Alt + Del ถูกปิดใช้งาน"

แทนที่ OpenSSH ด้วย DropBear

VPS ส่วนใหญ่มาพร้อมกับ OpenSSH ที่ติดตั้งซึ่งแน่นอนว่ามีประโยชน์มาก แต่ถ้าเราไม่จำเป็นต้องใช้ประโยชน์จากฟังก์ชันทั้งหมดของ OpenSSH ก็มีทางเลือกอื่นที่เบากว่าสำหรับ VPS เช่น ดรอปแบร์ซึ่งโดยปกติจะเพียงพอสำหรับการใช้งานเป็นประจำ อย่างไรก็ตามข้อเสียเปรียบของแอปพลิเคชันนี้คือไม่ได้มาพร้อมกับเซิร์ฟเวอร์ SFTP ในตัวและนั่นคือเหตุผลที่เราติดตั้งแพ็คเกจในตอนเริ่มต้น gesftpเซิร์ฟเวอร์.

ในการกำหนดค่า Dropbear เราจะแก้ไขไฟล์ / etc / default / dropbear เพื่อให้มีสองบรรทัดนี้:

NO_START = 0 DROPBEAR_EXTRA_ARGS = "- w -p 127.0.0.1:22 -I 1200 -m"

บรรทัดแรกเพียงแค่เปิดใช้บริการและบรรทัดที่สองทำหลายสิ่ง:

  1. หลีกเลี่ยงการเข้าถึงรูท
  2. ทำให้บริการฟังบนพอร์ต 22 ของอินเทอร์เฟซท้องถิ่น (เราจะอธิบายว่าทำไมในภายหลัง)
  3. ตั้งเวลารอ (20 นาที)

SSLH

พอร์ต 22 (SSH) เป็นที่รู้จักกันดีและโดยทั่วไปเป็นหนึ่งในกลุ่มแรก ๆ ที่แฮกเกอร์พยายามละเมิดดังนั้นเราจะใช้พอร์ต 443 (SSL) แทน เกิดขึ้นที่พอร์ตนี้ใช้สำหรับการท่องเว็บอย่างปลอดภัยผ่าน HTTPS

ด้วยเหตุนี้เราจะใช้แพ็คเกจ sslh ซึ่งไม่มีอะไรมากไปกว่ามัลติเพล็กเซอร์ที่วิเคราะห์แพ็กเก็ตที่มาถึงพอร์ต 443 และกำหนดเส้นทางภายในไปยังบริการหนึ่งหรืออีกบริการหนึ่งขึ้นอยู่กับว่าประเภทของการรับส่งข้อมูลเป็น SSH หรือ SSL

SSLH ไม่สามารถฟังบนอินเทอร์เฟซที่มีบริการอื่นอยู่แล้วซึ่งเป็นสาเหตุที่ก่อนหน้านี้เราทำให้ Dropbear ฟังบนอินเทอร์เฟซท้องถิ่น

ตอนนี้สิ่งที่เราต้องทำคือระบุ sslh อินเทอร์เฟซและพอร์ตที่ควรฟังและตำแหน่งที่จะเปลี่ยนเส้นทางแพ็กเก็ตขึ้นอยู่กับประเภทของบริการและสำหรับสิ่งนี้เราจะแก้ไขไฟล์กำหนดค่า / etc / default / sslh:

DAEMON = / usr / sbin / sslh DAEMON_OPTS = "- ผู้ใช้ sslh - ฟัง 250.250.250.155:443 --ssh 127.0.0.1:22 --ssl 127.0.0.1:443 --pidfile / var / run / sslh / sslh pid "RUN = ใช่

สุดท้ายเราเริ่มบริการใหม่:

service ssh stop && service dropbear start && service sslh restart

หลังจากคำสั่งก่อนหน้าเซสชันที่ปลอดภัยของเราอาจถูกขัดจังหวะซึ่งในกรณีนี้ก็เพียงพอที่จะเข้าสู่ระบบอีกครั้ง แต่คราวนี้กับผู้ใช้งานและใช้พอร์ต 443 หากเซสชันไม่ถูกขัดจังหวะขอแนะนำให้ปิดและ เริ่มต้นใหม่อีกครั้งด้วยค่าที่เหมาะสม

หากทุกอย่างทำงานได้อย่างถูกต้องเราสามารถทำงานต่อในฐานะรูทได้และหากต้องการให้ถอนการติดตั้ง OpenSSH:

sudo su - aptitude -r purge openssh-server

ไฟร์วอลล์

สิ่งต่อไปที่เราจะทำคือแยกบันทึกจากไฟร์วอลล์ลงในไฟล์แยกต่างหาก /var/log/firewall.log เพื่ออำนวยความสะดวกในการวิเคราะห์เพิ่มเติมซึ่งเป็นสาเหตุที่เราติดตั้งแพ็คเกจ ulogd เมื่อเริ่มต้น สำหรับสิ่งนี้เราจะแก้ไขไฟล์ /etc/logd.conf เพื่อปรับส่วนที่เกี่ยวข้อง:

[LOGEMU] file = "/ var / log / firewall.log" sync = 1

ต่อไปเราจะแก้ไขไฟล์การหมุนบันทึก / etc / logrotate / ulogd เพื่อรักษาการหมุนเวียนรายวัน (พร้อมวันที่) และบันทึกการบีบอัดในไดเร็กทอรี / var / log / ulog /:

/var/log/ulog/*.log /var/log/firewall.log {daily dateext missingok การบีบอัด delaycompress sharedscripts สร้าง 640 root adm postrotate /etc/init.d/ulogd reload mv /var/log/firewall.log-* .gz / var / log / ulog / endcript}

จากนั้นเราจะสร้างกฎ netfilter โดยดำเนินการดังต่อไปนี้:

IPT = $ (ซึ่ง iptables) IPEXT = 250.250.250.155 IPEXTBLK = 250.250.0.0 / 16 IPBCAST = 255.255.255.255 $ IPT -F $ IPT -X $ IPT -Z $ IPT -A INPUT -i lo -j ยอมรับ $ IPT - P INPUT DROP $ IPT -P FORWARD DROP $ IPT -P OUTPUT ACCEPT $ IPT -A INPUT -m state --state INVALID -j ULOG --ulog-prefix IN_INVALID $ IPT -A INPUT -p igmp -j ULOG --ulog -prefix IN_IGMP $ IPT -A INPUT -m pkttype --pkt-type broadcast -j ULOG --ulog-prefix IN_BCAST $ IPT -A INPUT -m pkttype --pkt-type multicast -j ULOG --ulog-prefix IN_MCAST $ IPT -A FORWARD -j ULOG --ulog-prefix FORWARD $ IPT -N ICMP_IN $ IPT -A INPUT!  -i lo -p icmp -j ICMP_IN $ IPT -A ICMP_IN -p icmp -f -j ULOG --ulog-prefix IN_ICMP_FRAGMENTED $ IPT -A ICMP_IN -p icmp -m icmp -m length!  - ความยาว 28: 1322 -j ULOG --ulog-prefix IN_ICMP_INVALIDSIZE $ IPT -A ICMP_IN -p icmp -m icmp -m hashlimit --hashlimit-above 4 / sec --hashlimit-mode srcip --hashlimit-srcmask 24 - -hashlimit-name icmpflood -j ULOG --ulog-prefix IN_ICMP_FLOOD $ IPT -A ICMP_IN -p icmp -m icmp -m hashlimit --hashlimit-upto 64kb / min --hashlimit-mode srcip --hashlimit-srcmask 24 - hashlimit - ชื่อ icmpattack -j ULOG --ulog-prefix IN_ICMP_FLOOD $ IPT -A ICMP_IN -p icmp -m icmp -m u32!  --u32 "0x4 & 0x3fff = 0x0" -j ULOG --ulog-prefix IN_ICMP_ATTACK $ IPT -A ICMP_IN -p icmp -m icmp!  --icmp-type echo-request -m state --state NEW -j ULOG --ulog-prefix IN_ICMP_INVALID $ IPT -A ICMP_IN -p icmp -m icmp --icmp-type echo-request -j ULOG --ulog- คำนำหน้า IN_ICMP $ IPT -A ICMP_IN -p icmp -m icmp --icmp-type echo-request -m limit --limit 1 / sec --limit-burst 4 -j ACCEPT $ IPT -A ICMP_IN -p icmp -m icmp - การตอบกลับแบบเสียงสะท้อน -m ขีด จำกัด - จำกัด 2 / วินาที - จำกัด - ระเบิด 4 -j ACCEPT $ IPT -A ICMP_IN -p icmp -m icmp - ปลายทางประเภท icmp - ไม่สามารถเข้าถึงได้ -m ขีด จำกัด - ขีด จำกัด 2 / วินาที - จำกัด - ระเบิด 4 -j ACCEPT $ IPT -A ICMP_IN -p icmp -m icmp - เวลาประเภท icmp เกินขีด จำกัด -m - จำกัด 2 / วินาที - จำกัด - ระเบิด 4 -j ยอมรับ $ IPT -A ICMP_IN -p icmp -m icmp --icmp-type parameter-problem -m limit --limit 2 / sec --limit-burst 4 -j ACCEPT $ IPT -A ICMP_IN -j RETURN $ IPT -N UDP_IN $ IPT -A อินพุต!  -i lo -p udp -j UDP_IN $ IPT -A UDP_IN!  - ฉันแท้จริง!  -p udp -f -j ULOG --ulog-prefix IN_UDP_FRAGMENTED $ IPT -A UDP_IN -p udp -m udp --sport ความยาว 53 -m!  - ความยาว 28: 576 -j ULOG --ulog-prefix IN_UDP_DNS_INVALIDSIZE $ IPT -A UDP_IN -p udp -m udp --dport 53 -m -state --state NEW -j ULOG --ulog-prefix IN_UDP_DNSREQUEST $ IPT - A UDP_IN -p udp -m udp --dport 53 -m -state --state ใหม่ -j REJECT - ปฏิเสธด้วย icmp-port - ไม่สามารถเข้าถึงได้ $ IPT -A UDP_IN -p udp -m udp!  - สปอร์ต 53!  -s $ IPEXTBLK!  -d $ IPBCAST -m state --state ใหม่ -j ULOG --ulog-prefix IN_UDP $ IPT -A UDP_IN -p udp -m udp -m state --state ESTABLISHED, RELATED -j ACCEPT $ IPT -A UDP_IN -j ส่งคืน $ IPT -N TCP_IN $ IPT -A INPUT!  -i lo -p tcp -j TCP_IN $ IPT -A TCP_IN!  - ฉันแท้จริง!  -p tcp -f -j ULOG --ulog-prefix IN_TCP_FRAGMENTED $ IPT -A TCP_IN -p tcp -m tcp --sport 53 -m state --state ESTABLISHED, RELATED -m length!  - ความยาว 513: 1500 -j ULOG --ulog-prefix IN_TCP_DNS_INVALIDSIZE $ IPT -A TCP_IN -p tcp -m tcp --dport 53 -m state --state NEW -j ULOG --ulog-prefix IN_TCP_DNS $ IPT -A TCP_IN -p tcp -m tcp --dport 53 -m state --state ใหม่ -j REJECT - ปฏิเสธด้วย icmp-port- ไม่สามารถเข้าถึงได้ $ IPT -A TCP_IN -p tcp -m tcp -m multiport!  --dports 80,443 -m state --state ใหม่ -j ULOG --ulog-prefix IN_TCP $ IPT -A TCP_IN -p tcp -m tcp -m multiport --dports 80,443 -m state --state NEW -m hashlimit - hashlimit -upto 4 / sec --hashlimit-burst 16 --hashlimit-mode srcip --hashlimit-name navreq -j ACCEPT $ IPT -A TCP_IN -p tcp -m tcp -m multiport --dports 80,443 -m state - state ESTABLISHED -m คอนลิมิต!  --connlimit-above 16 -j ACCEPT $ IPT -A TCP_IN -p tcp -m tcp -m multiport! 

ด้วยการกำหนดค่าก่อนหน้านี้ VPS ของเราควรมีความปลอดภัยพอสมควร แต่ถ้าเราต้องการเราจะรักษาความปลอดภัยได้มากกว่านี้ซึ่งเราสามารถใช้กฎขั้นสูงเพิ่มเติมได้

VPS บางตัวไม่อนุญาตให้ติดตั้งโมดูลเสริมสำหรับ netfilter แต่สิ่งที่มีประโยชน์มากคือ PSDซึ่งช่วยให้คุณหลีกเลี่ยงการสแกนพอร์ต น่าเสียดายที่โมดูลนี้ไม่ได้รวมอยู่ใน netfilter ตามค่าเริ่มต้นดังนั้นจึงจำเป็นต้องติดตั้งแพ็คเกจบางอย่างจากนั้นจึงสร้างโมดูล:

ความถนัด -RvW ติดตั้ง iptables-dev xtables-addons-source module-assistant module-assistant --verbose --text-mode auto-install xtables-addons-source

เมื่อดำเนินการด้านบนเสร็จแล้วเราสามารถเพิ่มกฎดังนี้:

iptables -A INPUT -m psd --psd-weight-threshold 15 --psd-delay-threshold 2000 --psd-lo-port-weight 3 --psd-hi-ports-weight 1 -j ULOG --ulog- คำนำหน้า IN_PORTSCAN

กฎก่อนหน้านี้โดยทั่วไปหมายความว่าเราจะสร้างตัวนับที่จะเพิ่มขึ้น 3 ในแต่ละครั้งที่พยายามเข้าถึงพอร์ตที่ต่ำกว่า 1024 และโดย 1 ในแต่ละครั้งที่พยายามเข้าถึงพอร์ตที่สูงกว่า 1023 และเมื่อตัวนับนี้ ถึง 15 ในช่วงเวลาน้อยกว่า 20 วินาทีแพ็คเกจจะได้รับการลงทะเบียนโดย ยูล็อก เป็นความพยายามในการ portscan ยังคงสามารถทิ้งแพ็คเก็ตได้ในครั้งเดียว แต่ในกรณีนี้เราตั้งใจจะใช้ fail2banซึ่งเราจะกำหนดค่าในภายหลัง

เมื่อสร้างกฎแล้วเราจะต้องใช้ความระมัดระวังบางประการเพื่อให้เป็นไปอย่างต่อเนื่องมิฉะนั้นเราจะสูญเสียกฎเมื่อเซิร์ฟเวอร์เริ่มต้นใหม่ มีหลายวิธีที่จะทำให้สำเร็จ ในบทช่วยสอนนี้เราจะใช้แพ็คเกจ iptables-persistent ที่เราติดตั้งไว้ตอนต้นซึ่งเก็บกฎไว้ /etc/iptables/rules.v4 y /etc/iptables/rules.v6 สำหรับ ipv6

iptables-save> /etc/iptables/rules.v4

ในความเป็นจริงแม้ว่าการใช้ ipv6 ในคิวบาจะยังไม่แพร่หลาย แต่เราก็สามารถสร้างกฎพื้นฐานบางประการได้:

IPT = $ (ซึ่ง ip6tables) $ IPT -P INPUT DROP $ IPT -P FORWARD DROP $ IPT -P OUTPUT ACCEPT $ IPT -A INPUT -i lo -j ยอมรับ $ IPT -A INPUT! -i lo -m state - รัฐที่จัดตั้งขึ้น, ที่เกี่ยวข้อง -j ยอมรับยกเลิกการตั้งค่า IPT

กฎเหล่านี้สามารถทำให้ถาวรได้:

ip6tables-save> /etc/iptables/rules.v6

สุดท้ายเพื่อความปลอดภัยที่มากขึ้นเราทำความสะอาดรีจิสทรีของไฟร์วอลล์และเริ่มบริการใหม่:

echo -n> /var/log/firewall.log บริการ logrotate รีสตาร์ทบริการ ulogd รีสตาร์ทบริการ iptables-persistent restart

Nginx

เราจะใช้ Nginx เป็นเว็บเซิร์ฟเวอร์เนื่องจาก VPS มักจะมีจำนวน RAM ที่ลดลงเมื่อเทียบกับเซิร์ฟเวอร์จริงดังนั้นโดยทั่วไปจึงสะดวกที่จะมีบางอย่างที่เบากว่า Apache

ก่อนกำหนดค่า Nginx เราจะสร้างใบรับรอง (ไม่มีรหัสผ่าน) สำหรับใช้ผ่าน HTTPS:

cd / etc / nginx openssl genrsa -des3 -out cert.key 4096 cp -v cert.key cert.key.original openssl req -new -key cert.key -out cert.csr openssl rsa -in cert.key.original - ออก cert.key openssl x509 -req -days 365 -in cert.csr -signkey cert.key -out cert.crt

เมื่อเสร็จแล้วเราจะสร้างไฟล์รหัสผ่านสำหรับผู้ใช้ "elusuario":

htpasswd -c .htpasswd ผู้ใช้

ต่อไปเราจะแก้ไขไฟล์ / etc / Nginx / ไซต์ใช้ได้ / การเริ่มต้น เพื่อตั้งค่าการตั้งค่าไซต์เริ่มต้น อาจมีลักษณะดังนี้:

เซิร์ฟเวอร์ {server_name localhost; ดัชนี index.html index.htm default.html default.htm; ราก / var / www; ตำแหน่ง / {# กำหนดลำดับการยืนยันและหน้าเว็บที่จะโหลดหากไม่พบ URI try_files $ uri $ uri / /index.html; }} เซิร์ฟเวอร์ {ฟัง 127.0.0.1:443; server_name localhost; ดัชนี index.html index.htm default.html default.htm; ราก / var / www; ssl บน; ssl_certificate cert.crt; ssl_certificate_key cert.key; ssl_session_timeout 5m; # เปิดใช้งาน HTTPS ผ่าน TLS เท่านั้น (ปลอดภัยกว่า SSL) ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # ให้ความสำคัญกับการเข้ารหัสที่มีความแข็งแรงสูง [สูง], # ย้ายการเข้ารหัสที่มีความแข็งแรงปานกลาง [MEDIUM] ไปที่ส่วนท้ายของรายการ # ปิดการใช้งานการเข้ารหัสความแรงต่ำ [ต่ำ] (40 และ 56 บิต) # ปิดการใช้งานการเข้ารหัสด้วยอัลกอริทึมการส่งออก [ EXP] # ปิดการใช้งานการเข้ารหัส null [eNULL] โดยไม่ต้องพิสูจน์ตัวตน [aNULL], SSL (เวอร์ชัน 2 และ 3) และ DSS (อนุญาตเฉพาะคีย์สูงสุด 1024 บิต) ssl_ciphers HIGH: + MEDIUM:! LOW:! EXP:! aNULL :! eNULL:! SSLv3:! SSLv2:! DSS; # ต้องการวิธีการเข้ารหัสของเซิร์ฟเวอร์ (โดยค่าเริ่มต้นจะใช้ไคลเอนต์) ssl_prefer_server_ciphers on; ตำแหน่ง / {# เปิดใช้งานการตรวจสอบสิทธิ์ auth_basic "เข้าสู่ระบบ"; auth_basic_user_file /etc/nginx/.htpasswd; # ตั้งค่าลำดับการตรวจสอบและรหัสหน้าที่จะโหลดหากไม่พบ URI try_files $ uri $ uri / = 404 # อนุญาตให้สร้างดัชนีสำหรับผู้ใช้ที่ตรวจสอบสิทธิ์ autoindex บน; autoindex_exact_size ปิด; autoindex_localtime บน; }}

เราตรวจสอบว่าการกำหนดค่าถูกต้อง:

nginx -t

ในที่สุดเราเริ่มบริการใหม่:

เริ่มต้นบริการ nginx ใหม่

Fail2Ban

ก่อนที่จะเริ่มกำหนดค่า Fail2Ban เพื่อความปลอดภัยยิ่งขึ้นเราจะหยุดบริการและทำความสะอาดรีจิสทรี:

fail2ban-client หยุด echo -n> /var/log/fail2ban.log

ต่อไปเราสร้างไฟล์กำหนดค่า /etc/fail2ban/jail.local ด้วยเนื้อหาที่กำหนดเองดังต่อไปนี้:

# ไฟล์กำหนดค่าแบบกำหนดเอง /etc/fail2ban/jail.local # [DEFAULT] findtime = 43200; bantime 12 ชั่วโมง = 86400; สูงสุด 1 วัน = 3; การแบนจะมีผลหลังจากความพยายามครั้งที่ 4 [ssh] เปิดใช้งาน = false [nginx-auth] เปิดใช้งาน = ตัวกรองจริง = nginx-auth action = iptables-multiport [name = NoAuthFailures, port = "http, https"] logpath = / var / log / nginx * / * ข้อผิดพลาด * .log [nginx-badbots] เปิดใช้งาน = ตัวกรองที่แท้จริง = การดำเนินการ apache-badbots = iptables-multiport [name = BadBots, port = "http, https"] logpath = / var / log / nginx * /*access*.log bantime = 604800; สูงสุด 1 สัปดาห์ = 0 [nginx-login] เปิดใช้งาน = true filter = nginx-login action = iptables-multiport [name = NoLoginFailures, port = "http, https"] logpath = / var / log / nginx * / * access * เข้าสู่ระบบ bantime = 1800; 30 นาที [nginx-noscript] เปิดใช้งาน = true action = iptables-multiport [name = NoScript, port = "http, https"] filter = nginx-noscript logpath = /var/log/nginx*/*access*.log maxretry = 0 [nginx-proxy] เปิดใช้งาน = true action = iptables-multiport [name = NoProxy, port = "http, https"] filter = nginx-proxy logpath = /var/log/nginx*/*access*.log bantime = 604800 ; สูงสุด 1 สัปดาห์ = 0 [firewall] เปิดใช้งาน = true action = iptables-multiport [name = Firewall] filter = firewall logpath = /var/log/firewall.log maxretry = 0

เมื่อเสร็จแล้วเราจะสร้างในไดเร็กทอรี /etc/fail2ban/filters.d/ ไฟล์ต่อไปนี้:

# /etc/fail2ban/filter.d/nginx-auth.conf # ตัวกรองการตรวจสอบสิทธิ์ # บล็อก IP ที่ไม่สามารถรับรองความถูกต้องโดยใช้การพิสูจน์ตัวตนพื้นฐาน # [คำจำกัดความ] failregex = ไม่มีการระบุผู้ใช้ / รหัสผ่านสำหรับการตรวจสอบสิทธิ์ขั้นพื้นฐาน ไม่พบผู้ใช้ * ในไคลเอนต์ *: ผู้ใช้ * รหัสผ่านไม่ตรงกัน * ไคลเอนต์: Ignoregex =
# /etc/fail2ban/filter.d/nginx-login.conf # ตัวกรองการเข้าสู่ระบบ # บล็อก IP ที่ไม่สามารถรับรองความถูกต้องโดยใช้หน้าเข้าสู่ระบบของเว็บแอปพลิเคชัน # สแกนบันทึกการเข้าถึง HTTP 200 + POST / เซสชัน => การเข้าสู่ระบบล้มเหลว # [คำจำกัดความ ] failregex = ^ -. * POST / เซสชัน HTTP / 1 \ .. "200 Ignoregex =
# /etc/fail2ban/filter.d/nginx-noscript.conf # ตัวกรอง Noscript # บล็อก IP ที่พยายามเรียกใช้สคริปต์เช่น. php, .pl, .exe และสคริปต์ตลกอื่น ๆ # ตรงกันเช่น # 192.168.1.1 - - "GET /something.php # [Definition] failregex = ^ -. * รับ. * (\. php | \ .asp | \ .exe | \ .pl | \ .cgi | \ scgi) เพิกเฉย =
# /etc/fail2ban/filter.d/proxy.conf # ตัวกรองพร็อกซี # บล็อก IP ที่พยายามใช้เซิร์ฟเวอร์เป็นพร็อกซี # ตรงกันเช่น # 192.168.1.1 - - "รับ http://www.something.com/ # [คำจำกัดความ] failregex = ^ -. * รับ http. * Ignoreregex =
# /etc/fail2ban/filter.d/firewall.conf # ตัวกรองไฟร์วอลล์ # [คำจำกัดความ] failregex = ^. * IN_ (INVALID | PORTSCAN | UDP | TCP |). * SRC = . * $ ignregex =

ในที่สุดเราเริ่มบริการและโหลดการกำหนดค่า:

fail2ban-service -b fail2ban-client รีโหลด

การยืนยัน

ในขั้นตอนสุดท้ายเราสามารถดูบันทึกด้วย หาง -f o มัลติเทล - ติดตามทั้งหมด. ในความเป็นจริงแอปพลิเคชันรุ่นหลังมีข้อได้เปรียบที่ช่วยให้สามารถดูไฟล์หลายไฟล์ในเวลาเดียวกันและมีการเน้นไวยากรณ์พื้นฐาน

ในกรณีที่ไม่ได้กำหนดค่าบัญชีอีเมลใน VPS ขอแนะนำให้ปิดการใช้งานข้อความเตือนที่ปรากฏขึ้นเมื่อเริ่มต้นหลายอีเมลซึ่งเราจะดำเนินการคำสั่งต่อไปนี้:

echo "check_mail: 0"> ~ / .multitailrc

อันที่จริงเราสามารถสร้างนามแฝง (4) เพื่อดูบันทึกได้อย่างรวดเร็วด้วยคำสั่งสั้น ๆ เช่น "โบย":

นามแฝง flog = 'multitail --follow-all /var/log/firewall.log /var/log/fail2ban.log'

1) สิ่งเหล่านี้เป็นค่าสมมติ
2) การเปิดใช้บริการอื่น ๆ เป็นเรื่องง่ายเมื่อคุณเข้าใจวิธีการทำงาน
3) สำหรับรายละเอียดเพิ่มเติมเรียกใช้ man sudoers
4) สามารถเพิ่มลงในไฟล์ ~ / .bash_aliases ได้


แสดงความคิดเห็นของคุณ

อีเมล์ของคุณจะไม่ถูกเผยแพร่ ช่องที่ต้องการถูกทำเครื่องหมายด้วย *

*

*

  1. ผู้รับผิดชอบข้อมูล: Miguel ÁngelGatón
  2. วัตถุประสงค์ของข้อมูล: ควบคุมสแปมการจัดการความคิดเห็น
  3. ถูกต้องตามกฎหมาย: ความยินยอมของคุณ
  4. การสื่อสารข้อมูล: ข้อมูลจะไม่ถูกสื่อสารไปยังบุคคลที่สามยกเว้นตามข้อผูกพันทางกฎหมาย
  5. การจัดเก็บข้อมูล: ฐานข้อมูลที่โฮสต์โดย Occentus Networks (EU)
  6. สิทธิ์: คุณสามารถ จำกัด กู้คืนและลบข้อมูลของคุณได้ตลอดเวลา

  1.   MSX dijo

    มีอะไรน่าสนใจบ้าง +1

  2.   ยูกิเทรุ dijo

    @Hugo บรรทัดนี้ในการกำหนดค่า:

    ssl_โปรโตคอล SSLv3 TLSv1;

    ฉันจะลบ SSLv3 ออกจากมันเนื่องจากโปรโตคอลนั้นไม่ปลอดภัยอีกต่อไปแม้ใน Debian Jessie บริการจำนวนมากได้รับการกำหนดค่าให้หลีกเลี่ยงการใช้โปรโตคอลนั้นด้วยเหตุผลนั้น

    ข้อมูลเกี่ยวกับหัวข้อที่นี่:

    https://www.linode.com/docs/security/security-patches/disabling-sslv3-for-poodle
    http://disablessl3.com/

    1.    ฮิวโก้ dijo

      แนวคิดนี้ไม่ได้มีไว้เพื่อเสนอบริการหลักผ่าน HTTPS แต่เพื่ออธิบายวิธีใช้พอร์ต 443 สำหรับ SSH โดยไม่สูญเสียความเป็นไปได้ในการใช้งานสำหรับ HTTPS หากจำเป็น แต่ต้องขอบคุณสำหรับคำเตือน

      อย่างไรก็ตามฉันได้อัปเดตบทความเพื่อแก้ไขการกำหนดค่า nginx เล็กน้อยและโดยบังเอิญรวมความคิดเห็นเพื่อชี้แจงสิ่งต่าง ๆ เพิ่มเติมเล็กน้อยด้วยกลไกการเข้ารหัสนี้และเพื่อแก้ไขข้อผิดพลาดเล็กน้อย

  3.   Daniel PZ dijo

    ขอบคุณมากสำหรับบทช่วยสอนที่ยอดเยี่ยมนี้ ตอนนี้ฉันจะนำไปปฏิบัติจริง! :D ทำต่อไปนะ DesdeLinuxพวกเขาทำให้ฉันประหลาดใจเสมอ คำทักทายจากเปรู

  4.   อันเดคูเอรา dijo

    ขอบคุณมากสำหรับการแบ่งปัน

  5.   เฟอร์นันโด dijo

    คำแนะนำที่ดีมากและมาจากไข่มุกตอนนี้ที่ฉันเริ่มในบล็อกนี้ แต่ยิ่งไปกว่านั้นตอนนี้ฉันกำลังจะติดตั้ง vps ตัวแรกและยังคงมีปัญหามากมาย แต่บทความนี้ทำให้ฉันหมดข้อสงสัยขอบคุณและทักทาย