Πώς να ασφαλίσετε τον διακομιστή ιστού Linux

Η δημιουργία ενός διακομιστή LAMP και η σωστή διαμόρφωσή του με αξιόπιστο χειρισμό δεδομένων, έναν τομέα και ένα πιστοποιητικό TLS είναι μόνο η μισή μάχη. Θα πρέπει επίσης να βεβαιωθείτε ότι η υποδομή σας προστατεύεται από τις πολλές τρομακτικές απειλές του Διαδικτύου.

Σε αυτό το άρθρο - το οποίο αποσπάστηκε από το κεφάλαιο 9 του βιβλίου Manning, Linux in Action - θα διερευνήσω την ασφάλεια του ιστότοπου μέσω της σωστής χρήσης των ομάδων συστήματος, της απομόνωσης της διαδικασίας και των τακτικών ελέγχων των πόρων του συστήματός σας. Δεν είναι ολόκληρη η ιστορία (το βιβλίο μου στο Linux σε δράση καλύπτει πρόσθετα εργαλεία, όπως εγκατάσταση πιστοποιητικών TLS και συνεργασία με το SELinux), αλλά είναι μια υπέροχη αρχή.

Ομάδες συστήματος και η αρχή του λιγότερο προνομίου

Οι προγραμματιστές που υποστηρίζετε έχουν (τελικά) συνειδητοποιήσει ότι πρέπει να περιορίσουν την πρόσβαση του κοινού στα αρχεία δεδομένων και διαμόρφωσης που ζουν στον διακομιστή εφαρμογών ενώ ταυτόχρονα επιτρέπουν την πρόσβαση σε διάφορες ομάδες dev και IT.

Το πρώτο μέρος της λύσης είναι ομάδες . Μια ομάδα είναι ένα αντικείμενο συστήματος - σχεδόν το ίδιο με έναν χρήστη - εκτός από το ότι κανείς δεν θα συνδεθεί ποτέ στο σύστημα ως ομάδα. Η δύναμη των ομάδων είναι ο τρόπος με τον οποίο, όπως οι χρήστες, μπορούν να «εκχωρηθούν» σε αρχεία ή καταλόγους, επιτρέποντας σε κάθε μέλος της ομάδας να μοιράζεται τις εξουσίες της ομάδας. Αυτό απεικονίζεται στο σχήμα.

Δοκιμάστε το μόνοι σας: χρησιμοποιήστε ένα πρόγραμμα επεξεργασίας κειμένου για να δημιουργήσετε ένα νέο αρχείο. Προσθέστε κάποιο κείμενο "Hello world", ώστε να μπορείτε εύκολα να πείτε πότε μπορείτε να αποκτήσετε πρόσβαση σε αυτό με επιτυχία. Τώρα επεξεργαστείτε τα δικαιώματά του χρησιμοποιώντας το chmod 770, έτσι ώστε ο κάτοχος και η ομάδα του αρχείου να έχουν πλήρη δικαιώματα στο αρχείο, αλλά άλλοι δεν μπορούν καν να το διαβάσουν.

nano datafile.txt chmod 770 datafile.txt

Εάν το σύστημά σας δεν διαθέτει ήδη έναν επιπλέον χρήστη εκτός από τον λογαριασμό σας, δημιουργήστε έναν χρησιμοποιώντας είτε τον πρόσθετο - τον τρόπο Debian / Ubuntu - είτε προσθέστε τον χρήστη εάν βρίσκεστε στο CentOS. Το useradd θα λειτουργήσει επίσης στο Ubuntu.

Η εντολή useradd (σε αντίθεση με το Debian adduser) απαιτεί από εσάς

δημιουργήστε έναν κωδικό πρόσβασης χρήστη ξεχωριστά:

# useradd otheruser # passwd otheruser Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully

Χρησιμοποιήστε το su για μετάβαση στον νέο σας χρήστη. Μόλις εισαγάγετε τον κωδικό πρόσβασης του χρήστη, όλες οι εντολές που εκτελείτε θα εκτελούνται ως αυτός ο χρήστης. Θα εργάζεστε μόνο με την εξουσία αυτού του χρήστη: όχι περισσότερο και όχι λιγότερο. Εάν προσπαθήσετε να διαβάσετε το αρχείο datafile.txt (χρησιμοποιώντας γάτα), δεν θα έχετε καμία τύχη αφού, όπως θυμάστε, σε άλλους δεν δόθηκε άδεια ανάγνωσης. Όταν τελειώσετε, πληκτρολογήστε exit για να αφήσετε το νέο κέλυφος χρήστη και να επιστρέψετε στο αρχικό σας κέλυφος.

$ su otheruser Password: $ cat /home/ubuntu/datafile.txt cat: /home/ubuntu/datafile.txt: Permission denied $ exit

Όλα αυτά είναι αναμενόμενα και εύκολα κατανοητά. Και, όπως έχετε δει, το να μην μπορείτε να διαβάσετε το αρχείο που ανήκει σε διαφορετικό πρόγραμμα ανάγνωσης μπορεί μερικές φορές να αποτελεί πρόβλημα. Ας δούμε τι μπορούμε να κάνουμε, συνδέοντας το αρχείο με μια ομάδα και στη συνέχεια ρυθμίζοντας σωστά τα δικαιώματα του αρχείου.

Δημιουργήστε μια νέα ομάδα που μπορείτε να χρησιμοποιήσετε για τη διαχείριση των δεδομένων της εφαρμογής σας και, στη συνέχεια, επεξεργαστείτε τις ιδιότητες του αρχείου δεδομένων σας χρησιμοποιώντας το chown. Το όρισμα ubuntu: app-data-group αφήνει την ιδιοκτησία του αρχείου στα χέρια του χρήστη του ubuntu, αλλά αλλάζει την ομάδα του στη νέα ομάδα δεδομένων-εφαρμογών.

groupadd app-data-group chown ubuntu:app-data-group datafile.txt

Εκτελέστε ls με έξοδο "long" στο αρχείο για να δείτε τα νέα δικαιώματα και την κατάστασή του. Σημειώστε ότι, όπως αναμενόταν, το ubuntu είναι ο κάτοχος του αρχείου και η ομάδα εφαρμογών-δεδομένων είναι η ομάδα του.

$ ls -l | grep datafile.txt -rwxrwx — — 1 ubuntu app-data-group 6 Aug 9 22:43 datafile.txt

Μπορείτε να χρησιμοποιήσετε το usermod για να προσθέσετε τον χρήστη σας στην ομάδα ομάδων εφαρμογών-δεδομένων και στη συνέχεια, για άλλη μια φορά, να μεταβείτε σε ένα κέλυφος που αναπτύσσει τον λογαριασμό του άλλου χρήστη. Αυτή τη φορά, παρόλο που τα δικαιώματα του αρχείου κλειδώνουν άλλους - και σίγουρα ενεργείτε ως "άλλος" χρήστης αυτήν τη στιγμή - θα πρέπει να μπορείτε να το διαβάσετε χάρη στην ομάδα σας.

# usermod -aG app-data-group otheruser $ su otheruser $ cat datafile.txt Hello World

Χρησιμοποιήστε το su για εναλλαγή μεταξύ λογαριασμών χρηστών. Αυτά ήταν τα περιεχόμενα του αρχείου datafile.txt. Αυτό το είδος οργάνωσης είναι ο σωστός και αποτελεσματικός τρόπος αντιμετώπισης πολλών από τα περίπλοκα ζητήματα δικαιωμάτων που θα προκύψουν σε ένα σύστημα πολλαπλών χρηστών.

Στην πραγματικότητα, όχι μόνο χρησιμοποιείται για να παρέχει σε μεμονωμένους χρήστες την πρόσβαση που χρειάζονται, αλλά πολλές διαδικασίες συστήματος δεν θα μπορούσαν να κάνουν τη δουλειά τους χωρίς ειδικές ομάδες μελών. Ρίξτε μια γρήγορη ματιά στο αρχείο / etc / group και σημειώστε πόσες διαδικασίες συστήματος έχουν τις δικές τους ομάδες.

Μερική λίστα των περιεχομένων του αρχείου / etc / group:

$ cat /etc/group root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4:syslog tty:x:5: disk:x:6: lp:x:7: mail:x:8: news:x:9: uucp:x:10: man:x:12: proxy:x:13: […]

Διαδικασίες απομόνωσης σε δοχεία

Ανησυχείτε ότι οι πολλαπλές υπηρεσίες που έχετε εκτελέσει σε έναν διακομιστή θα πρέπει, εάν παραβιαστεί μια υπηρεσία, να διατρέχουν όλοι κίνδυνο; Ένας τρόπος περιορισμού της ζημιάς που μπορούν να προκαλέσουν απρόσεκτοι ή κακόβουλοι χρήστες είναι η απομόνωση πόρων και διαδικασιών συστήματος. Με αυτόν τον τρόπο, ακόμα και αν κάποιος μπορεί να θέλει να επεκτείνει την εμβέλειά του πέρα ​​από ένα καθορισμένο όριο, δεν θα έχει φυσική πρόσβαση.

Η παλιά προσέγγιση στο πρόβλημα ήταν η παροχή ενός ξεχωριστού φυσικού μηχανήματος για κάθε υπηρεσία. Όμως, η εικονικοποίηση μπορεί να το κάνει πολύ πιο εύκολο - και πιο προσιτό - να κατασκευάσει μια "σιωπηλή" υποδομή.

Αυτή η αρχιτεκτονική αναφέρεται συχνά ως μικροσυσκευές και θα θέλατε να ξεκινήσετε πολλά κοντέινερ με ένα, ίσως, να τρέχει μόνο μια βάση δεδομένων, ένα άλλο Apache και ένα τρίτο που περιέχει αρχεία πολυμέσων που ενδέχεται να είναι ενσωματωμένα στις ιστοσελίδες σας. Εκτός από τα πολλά οφέλη απόδοσης και απόδοσης που σχετίζονται με τις αρχιτεκτονικές μικροεξυπηρέτησης, αυτό μπορεί να μειώσει σημαντικά την έκθεση σε κίνδυνο κάθε μεμονωμένου στοιχείου.

Με τα «εμπορευματοκιβώτια» δεν εννοώ απαραίτητα αυτά της πειθούς LXC.

Αυτές τις μέρες, για αυτό το είδος ανάπτυξης, τα κοντέινερ Docker είναι πολύ περισσότερα

δημοφιλής. Εάν ενδιαφέρεστε να μάθετε περισσότερα για το Docker, ρίξτε μια ματιά στα μαθήματα Pluralsight που αγγίζουν το θέμα.

Σάρωση για επικίνδυνες τιμές User ID

Ενώ οποιοσδήποτε χρήστης διαχειριστή θα μπορεί να αναλάβει προσωρινά την αρχή root χρησιμοποιώντας το sudo, μόνο το root είναι το root. Όπως έχετε ήδη δει, δεν είναι ασφαλές να εκτελείτε κανονικές λειτουργίες ως root. Αλλά μπορεί να συμβεί - είτε από αθώο ατύχημα είτε από κακόβουλη παραβίαση - ότι ένας κανονικός χρήστης μπορεί να έχει αποτελεσματικά δικαιώματα διαχειριστή με πλήρη απασχόληση.

The good news is that it’s easy to spot imposters: their user and/or group ID numbers will, like root, be zero (0). Take a look at the passwd file in /etc/. This file contains a record for each regular and system user account that currently exists. The first field contains the account name (root and ubuntu in this case) and the second field might contain an x in place of a password (which, if it exists, will appear encrypted in the /etc/shadow file). But the next two fields contain the user and group IDs. In the case of ubuntu in this example, both IDs are 1000 . And, as you can see, root has zeroes.

$ cat /etc/passwd root:x:0:0:root:/root:/bin/bash […] ubuntu:x:1000:1000::/home/ubuntu:/bin/bash

If you ever see a regular user with a user or group ID of 0, however, then you know there’s something nasty going on and you should get to work fixing it.The quick and easy way to spot a problem is to run this awk command against the passwd file, which will print out any line whose third field contains only a 0. In this case, to my great relief, the only result was root . You can run it a second time substituting $4 for $3 to pick up the group ID field.

$ awk -F: ‘($3 == “0”) {print}’ /etc/passwd root:x:0:0:root:/root:/bin/bash

Auditing system resources

The more things you’ve got running, the greater the odds of something breaking. So it makes sense that you’ll want to keep track of what’s running. This will apply to network ports (if they’re “open” then, by definition, there must be a way in), services (if they’re active, then people can run them), and installed software (if it’s installed, it can be executed).

For audits to be useful you’ll have to remember to run them once in a while. Since you just know you’re going to forget, you’ll be much better off incorporating your auditing tools into a script that not only executes regularly but, ideally, also parses the results to make them more readable.

Here, however, I’ll focus on introducing you to three key audit tools to help you scan for open ports, active services, and unnecessary software packages. Getting it automated will be your job.

Scanning for open ports

A port is considered “open” if there’s some process running on the host that’s listening on that port for requests. Keeping an eye on your open ports can keep you plugged into what’s really going on with your server.

You already know that a regular web server is probably going to have HTTP (80) and SSH (22) open, so it shouldn’t come as a surprise to come across those. But you’ll really want to focus on other unexpected results. netstat will display open ports along with a wealth of information about how they’re being used.

In this example run against a fairly typical multi-purpose server, -n tells netstat to include the numeric ports and addresses. -l includes only listening sockets, and -p adds the process ID of the listening program. Naturally, if you see something, do something.

# netstat -npl Active Internet connections (only servers) Proto Local Address Foreign Address State PID/Program name tcp 127.0.0.1:3306 0.0.0.0:* LISTEN 403/mysqld tcp 0.0.0.0:139 0.0.0.0:* LISTEN 270/smbd tcp 0.0.0.0:22 0.0.0.0:* LISTEN 333/sshd tcp 0.0.0.0:445 0.0.0.0:* LISTEN 270/smbd tcp6 :::80 :::* LISTEN 417/apache2 […]

In recent years, ss has begun to replace netstat for many uses. Just in case you find yourself at a party one day and someone asks you about ss , this example (which lists all established SSH connections) should give you enough information to save you from deep embarrassment:

$ ss -o state established ‘( dport = :ssh or sport = :ssh )’ Netid Recv-Q Send-Q Local Address:Port Peer Address:Port tcp 0 0 10.0.3.1:39874 10.0.3.96:ssh timer:(keepalive,18min,0)

Scanning for active services

Getting a quick snapshot of the systemd-managed services currently enabled on your machine can help you spot activity that doesn’t belong. systemctl can list all existing services, which can then be narrowed down to only those results whose descriptions include enabled. This will return only active services.

# systemctl list-unit-files — type=service — state=enabled [email protected] enabled bind9.service enabled cron.service enabled dbus-org.freedesktop.thermald.service enabled docker.service enabled [email protected] enabled haveged.service enabled mysql.service enabled networking.service enabled resolvconf.service enabled rsyslog.service enabled ssh.service enabled sshd.service enabled syslog.service enabled systemd-timesyncd.service enabled thermald.service enabled unattended-upgrades.service enabled ureadahead.service enabled

If you do find something that shouldn’t be there, you can use systemctl to both stop the service and make sure it doesn’t start up again with the next boot.

systemctl stop haveged systemctl disable haveged

There’s actually nothing dark and sinister about the haveged service I’m

stopping in this example: it’s a very small tool I often install to generate

random background system activity when I’m creating encryption keys.

Searching for installed software

Could someone or something have installed software on your system without you knowing? Well, how would you know if you don’t look? yum list installed or, on Debian/Ubuntu, dpkg — list will give you the whole briefing, while remove should delete any packages that don’t belong.

yum list installed yum remove packageName

Here’s how it goes on Ubuntu:

dpkg --list apt-get remove packageName

It’s also a good idea to be aware of changes to your system configuration files - which is something I cover in chapter 11.

Αυτό το άρθρο είναι απόσπασμα από το βιβλίο Manning "Linux in Action" . Υπάρχει πολύ περισσότερη διασκέδαση από την οποία προήλθε , συμπεριλαμβανομένου ενός υβριδικού μαθήματος που ονομάζεται Linux in Motion που αποτελείται από περισσότερες από δύο ώρες βίντεο και περίπου το 40% του κειμένου του Linux in Action. Ποιος ξέρει ... Μπορεί επίσης να απολαύσετε τις πρόσφατα δημοσιευμένες εκμάθηση των Υπηρεσιών Ιστού Amazon στο μήνα ενός γεύματος .