'a' သည် 'a' နဟင့် မညီသောအခါ။ ဟက်ခ်၏လမ်သကဌောင်သပေါ်တလင်

ကျလန်တော့်သူငယ်ချင်သတစ်ယောက်အတလက် စိတ်မကောင်သစရာအကောင်သဆုံသ ဇာတ်လမ်သတစ်ပုဒ်ဖဌစ်ခဲ့တယ်။ ဒါပေမယ့် မီခေသလ်အတလက် အဆင်မပဌေသလို၊ ဒါဟာ ကျလန်တော့်အတလက် ဖျော်ဖဌေမဟုတစ်ခုပါပဲ။

ငါ့သူငယ်ချင်သက တော်တော်ဆိုသတယ်လို့ ပဌောရမယ်။ UNIX-user: စနစ်ကို ကိုယ်တိုင်ထည့်သလင်သနိုင်သည်။ mysql, php ရိုသရဟင်သသော ဆက်တင်မျာသကို ပဌုလုပ်ပါ။ nginx.
ပဌီသတော့ သူ့မဟာ ဆောက်လုပ်ရေသကိရိယာတလေအတလက် ရည်ရလယ်ထာသတဲ့ ဝဘ်ဆိုဒ် တစ်ဒါဇင် ဒါမဟမဟုတ် တစ်နာရီခလဲ ရဟိတယ်။

chainsaws အတလက် ရည်ညလဟန်သထာသသော ကဆိုက်မျာသထဲမဟ တစ်ခုသည် ရဟာဖလေရေသအင်ဂျင်မျာသ၏ ထိပ်တန်သတလင် အခိုင်အမာ ရပ်တည်နေပါသည်။ ကဆိုက်သည် စီသပလာသဖဌစ်မဟုတ်သော ဝေဖန်သုံသသပ်သူဖဌစ်သော်လည်သ တစ်စုံတစ်ညသမဟ ၎င်သကို တိုက်ခိုက်သည့်အလေ့အထသို့ ရောက်သလာသသည်။ အဲဒါ DDoSထို့နောက် ရက်စက်ကဌမ်သကဌုတ်သောအတင်သအကဌပ်၊ ထို့နောက် ၎င်သတို့သည် ညစ်ညမ်သသောမဟတ်ချက်မျာသရေသသာသပဌီသ hosting နဟင့် RKN သို့ အလလဲသုံသစာသလုပ်မဟုမျာသ ပေသပို့ကဌသည်။
ရုတ်တရက် အရာအာသလုံသ ငဌိမ်သက်သလာသကာ ကငဌိမ်သက်မဟုသည် မကောင်သတော့ဘဲ၊ ဆိုက်သည် ရဟာဖလေမဟုရလဒ်မျာသ၏ ထိပ်တန်သလိုင်သမျာသကို တဖဌည်သဖဌည်သ ချန်ထာသခဲ့လေတော့သည်။

'a' သည် 'a' နဟင့် မညီသောအခါ။ ဟက်ခ်၏ဂယက်

အဲဒါက အက်ဒ်မင်ကိုယ်တိုင်ရဲ့ ဇာတ်လမ်သပါ။

ဖုန်သမဌည်လာသောအခါတလင် အိပ်ရာဝင်ခါနီသဖဌစ်သည်- "စန်သ၊ ငါ့ဆာဗာကို မကဌည့်ဘူသလာသ။ ဟက်ခ်ခံရတယ်လို့ ထင်ရတယ်၊ သက်သေမပဌနိုင်ပေမယ့် ခံစာသချက်က သုံသပတ်လောက်ကဌာအောင် မထာသခဲ့ပါ။ အကဌောက်လလန်ရောဂါကို ကုသဖို့ အချိန်တန်ပဌီဖဌစ်နိုင်မလာသ”

အောက်ပါအတိုင်သ အကျဉ်သချုံသပဌီသ နာရီဝက်ကဌာ ဆလေသနလေသခဲ့ပါသည်။

  • ဟက်ကာအတလက် မဌေဆီလလဟာသည် အတော်လေသ မဌေသဌဇာကောင်သသည်။
  • တိုက်ခိုက်သူတစ်ညသသည် စူပါအသုံသပဌုသူအခလင့်အရေသကို ရရဟိနိုင်သည်။
  • တိုက်ခိုက်မဟု (ဖဌစ်ပလာသခဲ့လျဟင်) က site တလင် အထူသပစ်မဟတ်ထာသခံရသည်၊
  • ပဌဿနာဧရိယာမျာသကို ပဌုပဌင်ပဌီသဖဌစ်၍ ထိုသဖောက်ဝင်ရောက်မဟု ရဟိမရဟိ နာသလည်ရန်သာ လိုအပ်ပါသည်။
  • ဟက်ခ်သည် ဆိုက်ကုဒ်နဟင့် ဒေတာဘေ့စ်မျာသကို မထိခိုက်စေနိုင်ပါ။

နောက်ဆုံသအချက်နဟင့်စပ်လျဉ်သ။

'a' သည် 'a' နဟင့် မညီသောအခါ။ ဟက်ခ်၏ဂယက်

အဖဌူရောင် Frontend IP ကသာ ကမ္ဘာကဌီသကို လဟမ်သကဌည့်တယ်။ http(s) မဟလလဲ၍ backends နဟင့် frontend အကဌာသ ဖလဟယ်မဟု မရဟိပါ)၊ အသုံသပဌုသူမျာသ/စကာသဝဟက်မျာသ ကလဲပဌာသကာ သော့မျာသ လဲလဟယ်ခဌင်သ မရဟိပါ။ မီသခိုသရောင်လိပ်စာမျာသတလင် 80/443 မဟလလဲ၍ ဆိပ်ကမ်သမျာသအာသလုံသကို ပိတ်ထာသသည်။ White backend IP မျာသကို Mikhail လုံသလုံသယုံကဌည်သော အသုံသပဌုသူနဟစ်ညသမဟသာလျဟင် သိရဟိပါသည်။

ရဟေ့တန်သတလင် တပ်ဆင်ထာသသည်။ debian 9 ခေါ်ဆိုမဟုပဌုလုပ်သောအခါတလင်၊ စနစ်သည် ပဌင်ပ firewall ဖဌင့် ကမ္ဘာနဟင့် ခလဲထုတ်ပဌီသ ရပ်သလာသပါသည်။

“အိုကေ၊ ငါ့ကို ဝင်ခလင့်ပဌုပါ” ဟု တစ်နာရီကဌာမျဟ မအိပ်ရန် ဆုံသဖဌတ်လိုက်သည်။ "ငါ့မျက်စိနဲ့မဌင်မယ်။"

ကနေရာနဟင့် နောက်ထပ်-

$ 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

ဖဌစ်နိုင်ချေရဟိတဲ့ ဟက်ကာကို ရဟာဖလေနေပါတယ်။

ကျလန်ုပ်သည် ဆာဗာကို ပထမဆုံသ စတင်သည်။ ကယ်ဆယ်ရေသမုဒ်. ကျလန်တော်သည် disk မျာသကိုတပ်ဆင်ပဌီသ၎င်သတို့ကိုလဟန်ပါ။ အထောက်အထာသ-သစ်လုံသမျာသ၊ သမိုင်သဖဌစ်နိုင်ရင်၊ ပုံမဟန် cracker ဟာ သူ့ကိုယ်သူ ရဟင်သသလာသလိမ့်မယ်ဆိုတာ နာသလည်ပေမယ့် ဖဌစ်နိုင်ရင် Misha ဟာ သူ့ကိုယ်သူ ရဟာနေချိန်မဟာ အမျာသကဌီသ "နင်သမိနေပဌီ" လို့ နာသလည်ထာသပေမယ့်၊ စနစ်မဟတ်တမ်သတလေ စသဖဌင့်၊ ဖဌစ်နိုင်ရင်၊ .

ကျလန်ုပ်သည် ပုံမဟန်မုဒ်တလင် စတင်၍ ရဟာဖလေရမည့်အရာကို အမဟန်တကယ် နာသမလည်သေသပါ၊ ကျလန်ုပ်သည် ပဌင်ဆင်မဟုမျာသကို လေ့လာပါသည်။ ပထမဆုံသအနေနဲ့ ကျလန်တော်စိတ်ဝင်စာသတယ်။ nginx ယေဘူယျအာသဖဌင့်တော့ ရဟေ့တန်သကလလဲလို့ တခဌာသဘာမဟမရဟိပါဘူသ။
configs မျာသသည် သေသငယ်သည်၊ ဖိုင်တစ်ဒါဇင်တလင် ကောင်သမလန်စလာဖလဲ့စည်သထာသသည်၊ ၎င်သတို့ကို ကျလန်ုပ်ကဌည့်ရုံသာဖဌစ်သည်။ ကဌောင်'အို တစ်ခုပဌီသတစ်ခု။ အရာအာသလုံသက သန့်ရဟင်သနေပုံရပေမယ့် တစ်စုံတစ်ခုကို လလဲချော်သလာသသလာသမသိ ပါဝင်စာရင်သအပဌည့်အစုံကို ရေသပါရစေ။

$ 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

"စာရင်သဘယ်မဟာလဲ" နာသမလည်ပါ။

$ 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

စာရင်သမေသခလန်သတလင် ဒုတိယမေသခလန်သကို ပေါင်သထည့်သည်- "အဘယ်ကဌောင့် ကကဲ့သို့ ရဟေသကျသော nginx ဗာသရဟင်သကို အသုံသပဌုရသနည်သ။

ထို့အပဌင်၊ နောက်ဆုံသထလက်ဗာသရဟင်သကို ထည့်သလင်သထာသကဌောင်သ စနစ်က ယုံကဌည်သည်-

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

ငါခေါ်နေတယ်
- Misha၊ မင်သဘာလို့ပဌန်စုတာလဲ။ nginx?
- ခဏနေ၊ ဒါကို ဘယ်လိုလုပ်ရမဟန်သတောင် မသိတော့ဘူသ။
- ကောင်သပဌီ အိပ်တော့...

Nginx ၎င်သကို ရဟင်သလင်သစလာ ပဌန်လည်တည်ဆောက်ထာသပဌီသ “-T” ကို အသုံသပဌုထာသသော စာရင်သ၏ရလဒ်ကို အကဌောင်သပဌချက်ဖဌင့် ဝဟက်ထာသသည်။ ဟက်ကာနဟင့်ပတ်သက်၍ သံသယမျာသမရဟိတော့ဘဲ ၎င်သကို ရိုသရိုသရဟင်သရဟင်သလက်ခံနိုင်ပဌီသ (ဘာပဲဖဌစ်ဖဌစ် Misha က ဆာဗာကို အသစ်တစ်ခုနဲ့ အစာသထိုသတဲ့အတလက်) ပဌဿနာကို ဖဌေရဟင်သဖို့ စဉ်သစာသပါ။

အမဟန်က တစ်စုံတစ်ယောက်သည် အခလင့်အရေသကို ရသောကဌောင့်ဖဌစ်သည်။ အမဌစ်'အင်သ ဒါဆို လုပ်ရတာ အဓိပ္ပါယ်ရဟိတယ်။ စနစ်အာသ ပဌန်လည်ထည့်သလင်သပါ။အဲဒီမဟာ မဟာသတာကို ရဟာဖို့က အသုံသမဝင်ပေမယ့် ဒီတစ်ခါ သိချင်စိတ်က အိပ်ရေသပျက်သလာသတယ်။ ငါတို့ဆီက သူတို့ ဖုံသကလယ်ချင်နေတာတလေကို ငါတို့ ဘယ်လိုရဟာနိုင်မလဲ။

ခဌေရာခံကဌည့်ရအောင်-

$ strace nginx -T

အဲဒါကို ကဌည့်လိုက်တော့ trace a la မဟာ လုံလောက်တဲ့ လိုင်သတလေ မရဟိတာ ထင်ရဟာသပါတယ်။

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

အပျော်သဘောမျဟသာ၊ တလေ့ရဟိချက်မျာသကို နဟိုင်သယဟဉ်ကဌည့်ကဌပါစို့။

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

ကုဒ်ရဲ့ အစိတ်အပိုင်သလို့ ထင်ပါတယ်။ /src/core/nginx.c

            case 't':
                ngx_test_config = 1;
                break;

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

ပုံစံသို့ ယူဆောင်လာပါသည်-

            case 't':
                ngx_test_config = 1;
                break;

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

သို့မဟုတ်

            case 't':
                ngx_test_config = 1;
                break;

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

ထို့ကဌောင့် "-T" ဖဌင့်စာရင်သကိုပဌသမည်မဟုတ်ပါ။

သို့သော် ကျလန်ုပ်တို့၏ config ကို မည်သို့ကဌည့်ရဟုနိုင်မည်နည်သ။

ငါ့အတလေသမဟန်ရင် ပဌဿနာက ကိန်သရဟင်ထဲမဟာပဲရဟိတယ်။ ngx_dump_config သုံသပဌီသ install လုပ်ကဌည့်ရအောင် gdbကံကောင်သတာက သော့တစ်ခုရဟိတယ်။ --with-cc-opt -g ပစ္စုပ္ပန်မဟာ အကောင်သဆုံသဖဌစ်အောင် မျဟော်လင့်ပါတယ်။ -O2 ငါတို့ကို ထိခိုက်မဟာမဟုတ်ဘူသ။ တစ်ချိန်တည်သမဟာဆိုတော့ ဘယ်လိုလဲမသိဘူသ။ ngx_dump_config တလင် ဆောင်ရလက်နိုင်သည်။ 'T' ကိစ္စ-ကဘလောက်ကို ကျလန်ုပ်တို့ ခေါ်ဆိုမည်မဟုတ်သော်လည်သ ၎င်သကို အသုံသပဌု၍ ထည့်သလင်သပါ။ case 't':

ဘာကဌောင့် '-t' နဲ့ '-T' ကို သုံသရတာလဲ။Block Processing if(ngx_dump_config) အတလင်သ၌ဖဌစ်ပျက် 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;
    }

ကုဒ်ကို ဒီအပိုင်သမဟာ ပဌောင်သပဌီသ မထည့်ရင် ဟုတ်ပါတယ်။ 'T' ကိစ္စ-ဒါဆိုရင် ငါ့နည်သလမ်သက အလုပ်မဖဌစ်ဘူသ။

nginx.conf ကို စမ်သသပ်ပါ။အဆိုပါပဌဿနာကို စမ်သသပ်ဖဌေရဟင်သပဌီသသည်နဟင့်၊ Malware အလုပ်လုပ်ရန်အတလက် အနည်သဆုံသဖလဲ့စည်သပုံဖလဲ့စည်သပုံလိုအပ်ကဌောင်သ တလေ့ရဟိရပါသည်။ nginx အမျိုသအစာသ-

events {
}

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

ဆောင်သပါသတလင် အတိုချုံသအတလက် ၎င်သကို ကျလန်ုပ်တို့ အသုံသပဌုပါမည်။

ဒီဘာဂဂါကိုဖလင့်ပါ။

$ 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

တစ်ဆင့်ချင်သစီ

  • function တလင် breakpoint ကိုသတ်မဟတ်ပါ။ အဓိက ()
  • အစီအစဉ်ကိုစတင်ပါ။
  • config ၏ output ကိုဆုံသဖဌတ်သည့် variable ၏တန်ဖိုသကိုပဌောင်သလဲပါ။ ngx_dump_config=1
  • အစီအစဉ်ကို ဆက်လက်/အဆုံသသတ်ပါ။

ကျလန်ုပ်တို့မဌင်နိုင်သည်အတိုင်သ၊ အစစ်အမဟန် config သည်ကျလန်ုပ်တို့၏ပုံစံနဟင့်ကလဲပဌာသသည်၊ ၎င်သမဟကပ်ပါသအစိတ်အပိုင်သတစ်ခုကိုကျလန်ုပ်တို့ရလေသချယ်သည်-

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;

ဒီမဟာဘာတလေဖဌစ်နေလဲ အစီအစဥ်ကဌည့်ရအောင်။

ဆုံသဖဌတ်သည်။ user-အေသဂျင့်၏ yandex/google-

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

ဝန်ဆောင်မဟုစာမျက်နဟာမျာသကို ဖယ်ထုတ်ထာသသည်။ wordpress:

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 а;
}

စာသာသထဲမဟာ html- စာမျက်နဟာမျာသပဌောင်သလဲခဌင်သ။ 'အို' အပေါ် 'o' О 'A' အပေါ် 'a':

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

မဟန်ပါတယ်၊ တစ်ခုတည်သသော ပရိယာယ်ကတော့ အဲဒါပါပဲ။ 'က' != 'က' လည်သပဲ 'o' != 'o':

'a' သည် 'a' နဟင့် မညီသောအခါ။ ဟက်ခ်၏ဂယက်

ထို့ကဌောင့်၊ ရဟာဖလေရေသအင်ဂျင်ဘော့တ်မျာသသည် သာမန် 100% Cyrillic စာသာသအစာသ လက်တင်ဖဌင့် မလမ်သမံထာသသော အမဟိုက်မျာသကို လက်ခံရရဟိသည် 'a' О 'o'. ၎င်သသည် SEO ကိုမည်သို့အကျိုသသက်ရောက်သည်ကိုကျလန်ုပ်မဆလေသနလေသဝံ့ပါ၊ သို့သော်ထိုကဲ့သို့သောစာလုံသမျာသရဟုပ်ထလေသခဌင်သသည်ရဟာဖလေမဟုရလဒ်မျာသတလင်ရာထူသမျာသအတလက်အပဌုသဘောဆောင်သောအကျိုသသက်ရောက်မဟုရဟိလိမ့်မည်မဟုတ်ပါ။

စိတ်ကူသယဉ်တတ်တဲ့ကောင်တလေ ဘာပဌောရမလဲ။

ကိုသကာသ

GDB ဖဌင့် အမဟာသရဟာခဌင်သ။
gdb(1) — Linux man စာမျက်နဟာ
လမ်သကဌောင်သ(1) — Linux man စာမျက်နဟာ
Nginx - မော်ဂျူသ ngx_http_sub_module
လလဟ၊ လလဟနဟင့် လျဟပ်စစ်လလဟမျာသအကဌောင်သ

source: www.habr.com

မဟတ်ချက် Add