Како осигурати свој Линук веб сервер

Изградња ЛАМП сервера и лепо конфигурисање са поузданим руковањем подацима, доменом и ТЛС сертификатом је само пола успеха. Такође ћете морати да будете сигурни да је ваша инфраструктура заштићена од многих застрашујућих претњи на Интернету.

У овом чланку - који је извучен из поглавља 9 моје књиге Маннинг, Линук у акцији - истражићу безбедност веб страница правилном употребом системских група, изолацијом процеса и редовним ревизијама ваших системских ресурса. Није цела прича (моја књига о Линуку на делу покрива додатне алате попут инсталирања ТЛС сертификата и рада са СЕЛинук-ом), али то је сјајан почетак.

Системске групе и принцип најмањих привилегија

Програмери које подржавате (коначно) схватили су да морају да ограниче јавни приступ подацима и датотекама за конфигурацију који живе на серверу апликација, а да истовремено дозволе приступ разним развојним и ИТ тимовима.

Први део решења су групе . Група је системски објект - готово исто што и корисник - осим што се нико никада неће пријавити у систем као група. Моћ група је у томе како се они, попут корисника, могу „доделити“ датотекама или директоријумима, омогућавајући било којим члановима групе да деле овлашћења групе. Ово је приказано на слици.

Испробајте ово сами: помоћу уређивача текста створите нову датотеку. Додајте неки текст „Здраво свете“, тако да ћете лако знати када му можете успешно приступити. Сада уредите његове дозволе помоћу цхмод 770 тако да власник датотеке и група имају пуна права над датотеком, али други не могу ни да је прочитају.

nano datafile.txt chmod 770 datafile.txt

Ако ваш систем поред вашег налога већ нема додатног корисника, направите га користећи аддусер - на начин Дебиан / Убунту - или усерадд ако сте на ЦентОС-у. усерадд ће такође радити на Убунту-у.

Команда усерадд (за разлику од Дебиан аддусера) захтева од вас

генерисати корисничку лозинку одвојено:

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

Користите су за прелазак на новог корисника. Једном када унесете корисничку лозинку, све наредбе које извршите покренуће се као тај корисник. Радит ћете само с ауторитетом тог корисника: ни више ни мање. Ако покушате прочитати датотеку датафиле.ткт (користећи мачку), нећете имати среће јер, као што се сећате, другима је ускраћено одобрење за читање. Када завршите, откуцајте екит да бисте напустили нову корисничку љуску и вратили се у своју изворну љуску.

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

Све ово је очекивано и лако разумљиво. И, као што сте видели, немогућност читања датотеке која припада другом читачу понекад може представљати проблем. Погледајмо шта можемо учинити с тим повезивањем датотеке са групом, а затим правилним подешавањем дозвола за датотеку.

Направите нову групу коју можете користити за управљање подацима апликације, а затим уредите својства датотеке података користећи цховн. Аргумент убунту: апп-дата-гроуп оставља власништво над датотекама у рукама корисника убунту-а, али мења своју групу у вашу нову апликацију-дата-гроуп.

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

Покрените лс са „лонг“ излазом према датотеци да бисте видели њене нове дозволе и статус. Имајте на уму да је, како се и очекивало, убунту власник датотеке, а апп-дата-гроуп његова група.

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

Можете да користите усермод да бисте свог корисника додали у групу апликација-података-групе, а затим, још једном, да се пребаците на љуску која распоређује налог другог корисника. Овога пута, иако дозволе за датотеку закључавају друге - а ви се тренутно понашате као „други“ корисник - требали бисте је моћи прочитати захваљујући чланству у групи.

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

Користите су за пребацивање између корисничких налога. Случајно је то био садржај моје датотеке датафиле.ткт. Оваква организација је исправан и ефикасан начин за решавање многих сложених проблема са дозволама који ће се појавити на вишекорисничком систему.

У ствари, не само да се користи да би се појединим корисницима омогућио приступ који им је потребан, већ многи системски процеси не би могли да раде свој посао без посебног чланства у групи. Кратко погледајте датотеку / етц / гроуп и забележите колико системски процеси имају своје групе.

Делимични списак садржаја датотеке / етц / гроуп:

$ 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: […]

Процеси изолације унутар контејнера

Забринути да ће више услуга које имате покренуте на једном серверу, да ли једна услуга треба да буде прекршена, а све у опасности? Један од начина да се ограничи штета коју неопрезни или злонамерни корисници могу да нанесу је изоловање системских ресурса и процеса. На овај начин, чак и ако неко можда жели да прошири свој досег преко постављене границе, неће имати физички приступ.

Стари приступ проблему био је обезбеђивање засебне физичке машине за сваку услугу. Али виртуелизација може много олакшати и приуштити изградњу „мрежне“ инфраструктуре.

Ова архитектура се често назива микроуслугама и захтева да покренете више контејнера са једним, можда, који покреће само базу података, други Апацхе и трећи који садржи медијске датотеке које би могле бити уграђене у ваше веб странице. Поред многих благодати перформанси и ефикасности повезаних са архитектурама микро-услуга, ово може у великој мери смањити изложеност сваке поједине компоненте.

Под „контејнерима“ не подразумевам нужно оне који убеђују у ЛКСЦ.

Данас су за ову врсту примене Доцкер-ови контејнери далеко више

популарни. Ако сте заинтересовани да сазнате више о Доцкеру, погледајте моје курсеве Плуралсигхт који се дотичу те теме.

Тражење опасних вредности Усер ИД-а

Иако ће било који корисник администратора моћи привремено да преузме овлашћење за роот користећи судо, само роот је заправо роот. Као што сте већ видели, није сигурно обављати редовне функције као роот. Али може се догодити - било невином несрећом или злонамерним неовлашћеним подметањем - да редовни корисник може ефикасно да добије администраторска права у пуном радном времену.

Добра вест је да је лако уочити варалице: њихови ИД бројеви корисника и / или група ће, попут роот-а, бити нула (0). Погледајте датотеку пассвд у / етц /. Ова датотека садржи запис за сваки редовни и системски кориснички рачун који тренутно постоји. Прво поље садржи назив налога (у овом случају роот и убунту), а друго поље може садржати к уместо лозинке (која ће се, ако постоји, појавити шифрована у датотеци / етц / схадов). Али следећа два поља садрже ИД-ове корисника и групе. У случају убунту-а у овом примеру, оба ИД-а су 1000. И, као што видите, роот има нуле.

$ 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.

Овај чланак је извађен из моје књиге Маннинг "Линук у акцији" . Много је више забаве одакле је ово потекло , укључујући хибридни курс под називом Линук ин Мотион који чини више од два сата видео записа и око 40% текста Линука у акцији. Ко зна ... Можда ћете уживати и у мојој недавно објављеној услузи Леарн Амазон Веб Сервицес у месецу ручка .