A few CSS tricks that frontend developers should know

 


1. Vertical alignment
- I offten use this in a CSS Navigation Menu.



2. Remove white space below image

Solution
.img-css {
    width: 300px;
    height: 200px;
    display: block;
}
or 
.img-css {
    vertical-align: middle
}
3. Using display: flex, the icon is distorted when the text is long

Solution
.cc {
  width: 50px;
  height: 50px;
  background-color: red;
  border-radius: 50%;
  margin-right: 20px;
  flex-shrink: 0;
}

4.  Truncate Text
Solution
{
    white-space: nowrap;
    text-overflow: ellipsis;
    overflow: hidden;
}

5. Disable Text Selection Highlighting
- If we want to disable the highlight effect.
Solution
user-select: none;

6. Make a Textarea Unable to Resize

7.  Math with Calc


8. Change an HTML5 Input’s Placeholder Color


The article will still be updated with more cool things about CSS. Thank you for your support and reading until now. 
Thank you!
Tips, Trick And Best Practices JavaScript

     "Hãy kiên trì và không ngừng học hỏi vì cuộc sống là một cuộc đua đầy thử thách, bạn sẽ nhận lại được vô số những bài học đáng giá".
      Hello Developers! 
      Học hỏi, tích luỹ những điều mới hàng ngày giúp chúng ta hoàn thiện kĩ năng của mình tốt hơn, giỏi hơn. Với một nhà phát triển phần mềm, công việc của chúng ta là liên tục học hỏi những điều mới, cập nhật công nghệ, cải thiện kĩ năng lập trình của chính mình. 
     Trong bài viết này, mình cùng các bạn tìm hiểu một số tips, tricks, phương pháp hay trong javascript.
  
1. Multiple “if and else”,  Switch...case,  Object Literal.
- Với những đoạn code có nhiều if else, else if, ta sẽ cảm thấy rất là tù. Vì vậy chúng ta sẽ thường nghĩ đến chuyển sang sử dụng switch case, trông sẽ tường minh, đẹp đẽ hơn. Và với mình thì mình cũng hay sử dụng thằng switch case.



    Switch case tốt nhưng nó cũng có một số vấn đề như phải break để ngăn nó chạy tiếp. Và mình thấy nó vẫn khá dài dòng, với object thì lại linh hoạt, ngắn gọn dễ hiểu. Cả hai phương pháp đều có những ưu nhược điểm khác nhau. Mình thì thường sử dụng switch case hơn =)). Một số trường hợp thì dùng object.

2. Destructuring, Spread Syntax and Rest Parameters.
- Những tính năng này giúp chúng ta làm việc với cấu trúc dữ liệu nhanh hơn, ngắn ngọn hơn.
Destructuring
- Là một cú pháp cho phép bạn gán các thuộc tính của một Object hoặc một Array.


 - Trên là ví dụ về Object Destructuring, còn dưới dây là ví dụ về Array Destructuring.


Spread Syntax


Rest Parameters.


3. Optional Chaining and Nullish Coalescing 
* Optional Chaining
- Giúp kiểm tra một thuộc tính có tồn tại hay không? Nếu không tồn tại sẽ return ra undefined.  


Optional Chaining giúp đoạn code ngắn ngọn hơn, dễ dàng truy cập sâu vào các thuộc tính của object.
With array.


Nullish Coalescing 
- Mình hay dùng toán tử || để cung cấp giá trị mặc định cho một biến. Và giờ mình vẫn hay dùng, khà khà, tuy nhiên mình có đọc được bài viết cẩn thẩn khi dùng toán tử or để cung cấp giá trị mặc định. Đọc thấy cũng đúng, rồi mình mò lên MDN đọc và biết tới thằng Nullish Coalescing.

 - Cú pháp: leftExpr ?? rightExpr
   Nếu leftExpr là nullish ( NULL or UNDEFINED ) thì kết quả sẽ là rightExpr. Còn leftExpr có giá trị thì kết quả là leftExpr.


4. Multiple Condition
    Có thể bạn đã gặp trường hợp có nhiều điều kiện cùng thực hiện một nhiệm vụ nào đó. Ví dụ như với quyền admin, leader hay member đều có chung một quyền nào đó ( ví dụ như quyền sửa, xoá bài viết, ....).


Chúng ta có nhiều cách giúp đoạn code ngắn ngọn, và trông xịn xò hơn.


Mình thì hay dùng thằng includes hơn :))

Bài viết sẽ vẫn còn cập nhật thêm những thứ hay ho về javascript. Cảm ơn các bạn ủng hộ và đọc tới tận bây giờ. Thank you.!
Xác thực hai lớp Two-Factor Authentication with Nodejs

 

     Theo Viện Tiêu chuẩn và Kỹ thuật Quốc gia Mỹ (NIST), hình thức nhận mã xác thực một lần qua tin nhắn SMS (SMS TOP) không đủ an toàn.
    Theo NIST, không cần truy cập vào thẻ SIM hay điện thoại của bạn, tin tặc cũng có thể hack để chuyển hướng tin nhắn của bạn sang điện thoại của chúng và chiếm đoạt những thông tin quan trọng. Các thủ thuật này tinh vi đến mức bạn sẽ không biết được tin nhắn mình đã bị đánh cắp.
NIST cũng cảnh báo những số điện thoại đăng ký trên các ứng dụng kiểu Facebook Messenger, Viber có khả năng bị hack và làm lộ mã xác thực trên SMS. Đây là những ứng dụng sử dụng VoIP, công nghệ truyền giọng nói qua Internet.
    Trước những rủi ro bảo mật, NIST khuyến cáo người dùng nên chuyển sang những ứng dụng tạo mã xác thực một lần, như Google Authenticator, Microsoft Authenticator,... Tin tặc không thể chuyển hướng mã xác thực tạo trên các ứng dụng này.
    Trong trường hợp một số trang web chỉ cho phép bạn xác thực 2 yếu tố bằng tin nhắn SMS, bạn vẫn nên sử dụng chúng. Mặc dù cách thức này không an toàn 100%, nhưng vẫn tốt hơn việc bạn chỉ đăng nhập bằng mật khẩu cơ bản.
    Xác thực 2FA dần đã khá quen với mọi người. Nó là phương pháp xác thực người dùng dựa trên hai yếu tố, một là mật khẩu ( điều bạn biết ), hai là một thứ mà người dùng sở hữu ( điều bạn có ) như tin nhắn SMS, dấu vân tay, gửi mã token tới email. Bài viết này sẽ sử dụng yếu tố xác thực thứ hai là TOTP ( Time based One time Password ). Để biết chi tiết về cơ chế TOTP như thế nào thì các bạn có thể tìm hiểu thêm trên google.
    Hôm nay mình sẽ cùng các bạn triển khai xác thực hai lớp - 2FA với nodejs sử dụng google authenticator.
Workflow của user enable 2FA ( user dùng được chức năng này phải nhập đúng mật khẩu hoặc một cách xác thực nào đó ) 1. Tải app google authenticator 2. Login ứng dụng và enable 2FA 3. Scan QR code hoặc nhập secret key. 4. Nhập mã code gg authenticator sinh ra => enable 2FA Workflow server
- Khi user enable 2FA, secret key sẽ được sinh ra ngẫu nhiên và gán riêng cho mỗi user. ( secret key lưu vào db ).
- QR or mã thủ công sẽ được generate từ secret key và các  thông tin liên quan gửi về user. - User scan và gửi mã code về, server sẽ check. Bắt tay vào code thôi. Mình sẽ không code từ đầu, mà sẽ dùng base có sẵn từ những bài viết trước, nếu các bạn chưa đọc thì có thể vào xem ở đây. https://www.hoangkhanh.tech/2020/08/authentication-use-passport-and-jwt-in.html (Phần 1)
https://www.hoangkhanh.tech2020/08/authentication-use-passport-and-jwt-in_11.html (Phần 2) Mình sử dụng thêm các module: - speakeasy : dùng để tạo mã code ( các bạn có thể dùng một thư viện khác, nhưng quan trọng là phải hỗ trợ thằng Google Authenticator nhé ) - qrcode: để sinh ra mã qr cho user scan. file routes/auth.js ( mình sẽ định nghĩa 2 api, một api để enable 2FA, một api để verify )


file controllers/auth.js



Khi đã enable 2FA mà login thì sẽ như thế này


Mình sẽ test nhé: Login và lấy token của user.



Enable 2FA



Đoạn mã qrcode mình để vào thẻ img nhé. Đoạn secret key có trả về cùng, user co thể viết lại ra giấy, tránh trường hợp bị mất điện thoại thì sẽ không login được nữa, vì thằng gg authenticator ko lưu secret key.


Scan qrcode và nó sẽ sinh mã code 6 số theo thời gian.


Nhập mã đúng trong thời điểm đó thì mới login được, còn không sẽ không login được đâu nhé!

Docs về thằng speakeasy trên npm mình đọc đau hết cả đầu, vì vậy khi đọc sau docs trên npm bạn có thể tham khảo bài viết sau để đỡ đau đầu hơn nhé. here. Thằng speakeasy mình cũng có thể dùng nó để làm mã otp được, có thời gian thì các bạn tìm hiểu về nó nhé.

Link Github: https://github.com/KhanhKitin/authentication-passport-nodejs.git Vậy là mình đã cùng các bạn triển khai xác thực 2 lớp với nodejs rồi, cảm ơn các bạn rất nhiều khi đã đọc tới tận đây.


Các kĩ thuật và giải pháp phát hiện botnet

 


    Bài viết được trích ra từ đồ án tốt nghiệp của mình. Mong rằng nó có thể giúp ích cho các bạn đang và sắp tìm hiểu về botnet.    
        Các phương pháp mà các nhà nghiên cứu bảo mật thường sử dụng để phát hiện botnet là:
             - Phát hiện dựa trên honeypot.
             - Phát hiện dựa trên giám sát và phân tích lưu lượng mạng.
             - Phát hiện dựa trên giám sát và phân tích DNS logs.

I. Phát hiện dựa trên honeypot

        Honeypot là một hệ thống tài nguyên được xây dựng với mục đích giả dạng, đánh lừa những kẻ sử dụng và xâm nhập không hợp pháp, thu hút sự chú ý của chúng, ngăn không cho chúng tiếp xúc với hệ thống thực. Hệ thống tài nguyên thông tin mà honeypot có thể giả dạng chẳng hạn như Mail Server, DNS server, Webserver, …Từ ý tưởng đánh lừa kẻ tấn công, chẳng hạn như phần mềm độc hại tự động, để chúng tấn công vào honeypot. Công việc tiếp theo là các chuyên gia bảo mật sẽ nghiên cứu phần mềm độc hại đó một cách chi tiết để thu thập thông tin về botnet, như nguồn gốc của máy chủ C&C, các thành viên trong botnet, hay các hành vi tấn công của botnet. Honeypot được chia thành hai loại chính là honeypot tương tác thấp và honeypot tương tác cao.

        - Honeypot tương tác thấp: Các dịch vụ hoặc hệ điều hành được mô phỏng ở mức độ tương tác thấp. Mục đích chính của những honeypot này là nắm bắt các mẫu code độc hại, vì thế việc triển khai và duy trì chúng tương đối dễ dàng và cũng ít gặp rủi ro, nhưng bị giới hạn về số lượng dịch vụ. Phổ biến cho loại honeypot này là Nepenthes. Nepenthes được xây dựng với mục đích thu thập càng nhiều mẫu phần mềm độc hại càng tốt. Sau khi đã thu thập được, các chuyên gia sẽ phân tích chúng. Trước tiên sẽ quét để tìm ra đặc tính, sau đó là hành vi thông qua sandbox.

        - Honeypot tương tác cao: Cho phép kẻ tấn công tương tác với một hệ thống thực. Mức độ rủi ro khi triển khai cao hơn, do đó cần thiết lập các biện pháp phòng ngừa và các điều khoản đặc biệt để ngăn chặn các cuộc tấn công chống lại hệ thống. Ngoài ra, honeypot dạng này cũng khó thiết lập triển khai và duy trì hơn. Mục đích chính của các honeypot này là để hiểu rõ các tình huống tấn công, vì thế nó yêu cầu một khả năng tương tác mạnh mẽ đối với kẻ tấn công. Một thiết lập phổ biến nhất cho loại honeypot này là GenII.

        Phương pháp phát hiện botnet dựa vào honeypot mang lại hiệu quả cao trong việc nghiên cứu và phân tích các đặc điểm của botnet, đã được nhiều chuyên gia đánh giá cao. Tuy nhiên, phương pháp này không thực sự có nhiều ý nghĩa trong việc phát hiện sự lây nhiễm của botnet. 

II. Phát hiện dựa trên giám sát và phân tích lưu lượng mạng

Phương pháp này dựa trên việc theo dõi và phân tích lưu lượng mạng mang lại nhiều kết quả trong việc xác định sự tồn tại của các botnet. Có nhiều lưu lượng mạng có thể theo dõi để phát hiện botnet, ví dụ như DNS, Netflow…Các kĩ thuật chính trong phương pháp này là: dựa trên chữ ký, dựa trên bất thường.

1. Dựa trên chữ ký

Một khi botnet được phát hiện, các nhà nghiên cứu sẽ cố gắng phân tích mã và hành vi của bot để tạo ra chữ ký, sau đó chữ ký này có thể được sử dụng bởi một hệ thống phát hiện xâm nhập (IDS). Chữ ký ở đây là một bộ sưu tập thông tin có chứa tất cả các chi tiết liên quan về sự lây nhiễm hay các truyền thông độc hại. Nó gồm các thông tin như tên tệp tin, các URL, một chuỗi các bit hoặc bất kỳ thông tin nào có ích trong việc phát hiện botnet. IDS sau đó sẽ kiểm tra nội dung và tăng cường cảnh báo bất cứ khi nào phát hiện một chữ ký khớp. Hệ thống phát hiện xâm nhập mã nguồn mở Snort là ví dụ điển hình cho trường hợp này.

Chữ ký được thu thập dựa trên thông tin thu thập được từ botnet, vì vậy nên nó chỉ hiệu quả đối với các botnet đã biết. Với các botnet mới, phương pháp này sẽ không phát huy được tính hiệu quả của nó.

2. Dựa trên bất thường

Phát hiện botnet thông qua việc phân tích sự bất thường trong lưu lượng mạng bao gồm độ trễ, sự xuất hiện lưu lượng mạng trên các cổng bất thường hay hệ thống đột ngột nhận được nhiều gói tin hơn dữ kiến. Tất cả đều có thể là dấu hiệu của botnet xuất hiện trong mạng. Phương pháp này có thể chia thành các kỹ thuật sau:

        - Dựa trên máy chủ: Một số kỹ thuật dựa trên máy chủ được thực hiện bằng việc theo dõi và phân tích bên trong của một hệ thống máy tính thay vì lưu lượng mạng được hiển thị bên ngoài gao diện. Trong phương pháp này, các máy tính cá nhân trong hệ thống được theo dõi để tìm ra bất kỳ hành vi đáng ngờ nào, bao gồm việc truy cập vào tệp không hợp lệ hay khả năng xử lý của nó. Nếu phát hiện hoạt động đáng này, hệ thống phát hiện xâm nhập máy chủ sẽ thông báo cho người dùng hoặc quản trị viên. Nếu các tệp quan trọng trên hệ thống bị sửa đổi hoặc xóa, một cảnh báo sẽ được gửi tới quản trị viên để điều tra.

        - Dựa trên giám sát: kĩ thuật này được chia thành hai loại là giám sát chủ động và giám sát thụ động.

            + Giám sát chủ động: Ý tưởng cho kỹ thuật này đó là tiêm các gói thử nghiệm vào mạng, máy chủ hoặc ứng dụng để tìm hoạt động đáng ngờ có thể gây ra bởi con người hoặc bot, chẳng hạn như BotProbe. Kỹ thuật này cho thấy mức độ hiệu quả của việc phát hiện botnet dựa trên IRC.

            + Giám sát thụ động: Giám sát và phát hiện các giao tiếp bất thường trong mạng trong thời gian dài. Phương pháp này tận dụng mô hình giao tiếp giống nhau được sử dụng bởi các bot trong cùng một botnet, ở cả kiến trúc tập trung hoặc phi tập trung. Để tăng hiệu quả, các chuyên gia cũng áp dụng thêm các phương pháp như lý thuyết đồ thị, chia cụm, học máy hay phân tích nhóm.

        - Dựa trên giao thức:

            Giao thức IRC: là giao thức từng được sử dụng rất nhiều bởi các botnet đời đầu, vì vậy phương pháp phát hiện botnet trên giao thức này được giới thiệu từ rất sớm. Phương pháp này tập trung vào việc giám sát các giao tiếp IRC, và phân tích sự tương quan giữa các gói tin mạng thu được và các gói tin mẫu của botnet. Ngoài ra, giải pháp phát hiện botnet trên IRC dựa trên chữ ký cũng là một phương pháp đáng chú ý. Nó có thể phát hiện các IRC nickname và máy chủ IRC đáng ngờ cũng như các cổng bất thường được mở.

          + Giao thức SMTP: được các botnet sử dụng để thực hiện spam với số lượng lớn. Các botnet được tạo ra với mục đích để spam được gọi là spambot. Để phát hiện spambot, công cụ BotMagnifier [10] ra đời. Nó sử dụng các bộ dữ liệu từ DNSBLs (Domain Name System based Blackhole List) và log của spamhaus để phát hiện hành động spam của bot.

          + Peer-to-peer: Các kỹ thuật phát hiện botnet P2P thường sử dụng các số liệu mẫu của các máy tham gia vào giao tiếp P2P và tạo thành fingerprint. Fingerprint sau đó sẽ được sử dụng để so sánh lưu lượng mạng giữa P2P bình thường và P2P botnet.

III. Phát hiện dựa trên giám sát và phân tích DNS logs

        Các kỹ thuật phát hiện botnet dựa trên DNS là sự kết hợp giữa hai phương pháp: dựa trên hành vi và dựa trên khai phá dữ liệu của lưu lượng DNS. Botmaster sử dụng DNS để quản lý botnet của mình. Hơn nữa, botmaster lợi dụng sự nhanh nhạy của DNS để ẩn náu và làm hỏng các nỗ lực phát hiện. Do đó, các truy vấn DNS được thực hiện trong suốt vòng đời của botnet và có thể được sử dụng để phân biệt các truy vấn DNS botnet từ các truy vấn DNS hợp lệ.

Năm 2005, Dagon đã đề xuất một cơ chế xác định máy chủ C&C bằng cách phát hiện các tên miền có tỉ lệ truy vấn DDNS (Dynamic DNS - phương thức ánh xạ tên miền tới địa chỉ IP có tần suất thay đổi cao) cao hoặc bất thường. Kỹ thuật này tương tự như phương pháp được đề xuất bởi Kristoff năm 2004. Tuy nhiên, cả hai kỹ thuật này đều có thể dễ dàng trốn tránh bằng cách sử dụng các truy vấn DNS giả mạo. Hơn nữa, kỹ thuật này tạo ra tỉ lệ dương tính giả khá cao do phân loại sai các tên miền hợp pháp sử dụng DNS với thời gian sống ngắn.

Năm 2006, Schonewille và Van Helmond đã đưa ra một cách tiếp cận khác, dựa trên tỉ lệ trả lời định kỳ bất thường của các NXDomain (Non-Existent Domain). Để phân loại các tỉ lệ trả lời bất thường, họ sử dụng các thuật toán tương tự như các thuật toán mà Dagon đã sử dụng. Theo quan sát của họ, những NXDomain thường là những máy chủ CnC đã bị các cơ quan chức năng gỡ xuống. Các máy tính nhiều lần gửi yêu cầu truy vấn đến đó có thể là một bot hoặc đã bị lây nhiễm. Phương pháp này rất hiệu quả để phát hiện một số tên miền đáng ngờ và có thể có tỉ lệ dương tính giả thấp hơn.

Ramachandran và cộng sự đã đề xuất một phương pháp xác định botnet bằng cách phân tích lưu lượng tra cứu DNSBL (DNS-based Black-hole List). Mục tiêu của phương pháp này là phân biệt các truy vấn DNSBL do các botmaster gửi đến trong số những lưu lượng DNSBL hợp pháp để xác định các đối tượng đáng ngờ có khả năng là bot. Phương pháp này có thể được sử dụng cho các hoạt động trinh sát trong thời gian thực. Các botmaster thường thực hiện hành vi tra cứu trước khi sử dụng các bot trong cuộc tấn công, do đó các thông tin phản hồi DNSBL có thể được sử dụng để đưa ra các cảnh báo sớm. Hơn nữa, kỹ thuật này không đòi hỏi phải liên lạc trực tiếp với bất cứ thành phần nào của botnet và không làm gián đoạn hoạt động của botnet. Tuy nhiên, kỹ thuật này cũng có nhiều rủi ro về cảnh báo dương tính giả, và không thể phát hiện được các cuộc trinh thám dò xét phân tán.

Năm 2007, Choi và cộng sự đã đề xuất một cơ chế phát hiện botnet mới dựa trên sự bất thường bằng cách giám sát các hoạt động nhóm trong lưu lượng DNS. Họ cũng phát triển một cơ chế cho phép phát hiện việc di chuyển máy chủ C&C. Phương pháp này mạnh mẽ hơn các phương pháp trước đó, và nó có thể phát hiện nhiều loại botnet, trong đó có cả các botnet sử dụng các kênh đã được mã hóa vì nó sử dụng các thông tin trong tiêu đề IP. Tuy nhiên, nhược điểm lớn nhất của phương pháp này là thời gian xử lý cao, nhất là đối với việc giám sát một mạng lưới lớn.

Ngoài ra cũng còn nhiều đề xuất khác cho phương pháp phát hiện botnet dựa trên DNS. Trong đó có phương pháp dựa trên học máy.

Hầu hết các botnet đều sử dụng DGA (Domain Generation Algorithms) để liên lạc với botmaster. Các chuyên gia bảo mật phải dịch ngược mã nguồn của bot và tách thuật toán DGA để tìm nguyên lý hoạt động. Đối với các botnet dạng này, ta có thể dùng học máy để dự đoán các tên miền được tạo ra bởi DGA bằng cách phân tích truy vấn DNS. 

Bạn có thể tìm hiểu thêm về botnet ở đây


Dockerize React App with a Docker multi-staged build

Hello mọi người!
Hôm nay mình sẽ deploy react app lên server sử dụng docker. Ok, vào việc luôn nhỉ?

Nội dung:
- Install Docker On Ubuntu 18.04.
- Dockerizing a React App with Nginx.

I.  Install Docker On Ubuntu 18.04

- Truy cập vào server và cài các gói dịch vụ cần thiết:  

sudo apt-get update
sudo apt-get install curl apt-transport-https ca-certificates software-properties-common

Bây giờ chúng ta thêm Repositories Docker

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update

Đảm bảo rằng bạn đang cài từ Docker repo thay vì Ubuntu repo bằng lệnh sau: 

apt-cache policy docker-ce

Giờ chỉ cần dùng lệnh apt để install Docker lên Ubuntu

sudo apt-get install docker-ce

Kiểm tra tình trạng docker sau khi cài: 

sudo systemctl status docker

À mình dùng cả docker compose nữa nên mình sẽ cài thêm bằng lệnh sau: 

sudo apt-get install docker-compose

II. Dockerizing a React App with Nginx

- Đầu tiên chuẩn bị project reactjs.

1. Build Image

- Để dockerize một project trước hết chúng ta cần phải cấu hình Dockerfile để định nghĩa Image với môi trường và những thứ cần thiết cho project.

Cấu hình Dockerfile

1. Nói với thằng docker rằng t cần môi trường với Image có tên là node:10-alpine. Tại sao là alpine?
- Alpine Linux nhỏ hơn nhiều so với hầu hết các base Image khác (~ 5MB). 
- Nhẹ, tối giản và tập trung vào bảo mật cao.
Giai đoạn này gọi là buid. ( as build )
2. Workdir /app: trong image tạo thư mục app và chuyển đến đường dẫn /app.
3. Copy toàn bộ code ở môi trường gốc.
4. Cài đặt các package.
5. Buid project.
6. Sang giai đoạn mới. FROM nginx:stable-alpine. Ý là nói với thằng docker là  t cần thêm image nginx nữa. 
Nginx là cái gì? Thì nginx ở đây là webserver. Nginx rất xịn nhé ( Khoai khi mới tiếp cập, khi đã giác ngộ thì bánh cuốn vc. Chắc sẽ viết thêm về nginx sau này).
7. Copy files build ở giai đoạn buid phía trước sang /usr/share/nginx/html, đây chính là nơi Nginx sẽ tìm tới và trả về cho user khi user truy cập ở trình duyệt.
8. Copy files config nginx sang.
9. App sẽ chạy ở port 80.
10. Khới động nginx. 

File config nginx.


File .dockerignore

File docker-compose.yml

Đặt tên cho ứng dụng mình. Đề cập tới Dockerfile sử dụng. Mapping port 80 với port 80 của ứng dụng. ( port 80 bên trái là port của server - môi trường gốc, port 80 bên phải là port của container).

Giờ ta chỉ cần run container

docker-compose up

Chạy nền thì sử dụng: docker-compose -d up

Vậy là mình đã sử dụng docker để deploy react app lên server sử dụng công nghệ ảo hóa.

Lợi ích:

- Docker cho bạn môi trường mục tiêu cụ thể.

- Môi trường trong docker độc lập với môi trường gốc ( không bị xung đột, phụ thuộc lẫn nhau).

- Docker có nhiều tiện tích đi kèm ( Kubernetes: tự động scale, tự động deploy, tự động và tự động)

- .......

III. Docker

- Khái niệm: Docker là một dự án mã nguồn mở giúp tự động triển khai các ứng dụng Linux và Windows vào trong các container ảo hóa. Docker cung cấp một lớp trừu tượng và tự động ảo hóa dựa trên LinuxDocker là một dự án mã nguồn mở giúp tự động triển khai các ứng dụng Linux và Windows vào trong các container ảo hóa. Docker cung cấp một lớp trừu tượng và tự động ảo hóa dựa trên Linux.

- Docker có hai khái niệm chính cần hiểu, đó là image và container.

1. Image 

- Image sẽ định nghĩa cho 1 môi trường và những thứ có trong môi trường đó. Ứng dụng của ta muốn chạy được thì cần phải có Image.

Ví dụ: trong image có thể định nghĩa các thành phần: Ubuntu, Mysql,...

- Để tạo Image ta cần tạo một Dockerfile.

Một số lệnh trong Dockerfile:

FROM <base_image>:<phiên_bản>: đây là câu lệnh bắt buộc phải có trong bất kỳ Dockerfile nào. Nó dùng để khai báo base Image mà chúng ta sẽ build mới Image của chúng ta.

MAINTAINER <tên_tác_giả>: câu lệnh này dùng để khai báo trên tác giả tạo ra Image, chúng ta có thể khai báo nó hoặc không.

RUN <câu_lệnh>: chúng ta sử dụng lệnh này để chạy một command cho việc cài đặt các công cụ cần thiết cho Image của chúng ta.

CMD <câu_lệnh>: trong một Dockerfile thì chúng ta chỉ có duy nhất một câu lệnh CMD, câu lệnh này dùng để xác định quyền thực thi của các câu lệnh khi chúng ta tạo mới Image.

ADD <src> <dest>: câu lệnh này dùng để copy một tập tin local hoặc remote nào đó (khai báo bằng <src>) vào một vị trí nào đó trên Container (khai báo bằng dest).

ENV <tên_biến>: định nghĩa biến môi trường trong Container.

ENTRYPOINT <câu_lệnh>: định nghĩa những command mặc định, cái mà sẽ được chạy khi container running.

VOLUME <tên_thư_mục>: dùng để truy cập hoặc liên kết một thư mục nào đó trong Container.

WORKDIR: Thiết lập thư mục đang làm việc cho các chỉ thị khác như: RUN, CMD, ENTRYPOINT, COPY, ADD,…

EXPOSE: khai báo port lắng nghe của image

Câu lệnh build image:

docker build -t “name image” .

Ở cuối có 1 dấu "chấm" ý bảo là Docker hãy build Image với context (bối cảnh) ở folder hiện tại này. Và Docker sẽ tìm ở folder hiện tại Dockerfile và build.

Để show: docker images

Xóa image: docker rmi “mã image”

2. Container

- Container: Tương tự như một máy ảo, xuất hiện khi mình khởi chạy image.

docker container run -p port:port  “name images”

-p port:port ( port trái là port môi trường gốc, port phải là port của container

Truy cập vào container và gắn terminal bash vào nó

docker exec -it <container id> /bin/bash


Cảm ơn mọi người đã đọc đến đây. Nếu cảm thấy hay và có ích thì hãy chia sẻ để mọi người cùng biết thêm kiến thức.

Tài liệu tham khảo:
https://docs.docker.com/get-started
https://dev.to/bahachammakhi/dockerizing-a-react-app-with-nginx-using-multi-stage-builds-1nfm
https://viblo.asia/p/docker-nhung-kien-thuc-co-ban-phan-1-bJzKmM1kK9N


Thiết lập MySQL trên Máy chủ. Tạo người dùng mới và cấp quyền trong MySQL

 

Sau một thời gian vắng bóng, mình đã quay trở lại rồi đây, haha....
Gần đây, mình cũng setup mysql trên server nên tiện viết blog về nó này luôn. Ok, vào việc luôn nhỉ.

1. Cài mysql trên server CentOS 7
 -  Update hệ thống:   sudo yum update 
 -  Cài MySQL repositories: 
  wget http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm 
 -  Cài đặt MySQL:
  sudo rpm -Uvh mysql57-community-release-el7-9.noarch.rpm
 -  Ok, yum thôi: 
 sudo yum install mysql-server
 Khởi động mysql: 
 sudo systemctl start mysqld
 Check mysql: 
 sudo systemctl status mysqld

2. Cài mysql trên server Ubuntu
-  Update hệ thống và cài mysql 
sudo apt update
sudo apt install mysql-server -y -  Kiểm tra trạng thái mysql 
sudo systemctl status mysql

Phía trên là 2 cách cài mysql. Sau khi cài xong thì mình còn phải setup bảo mật cho mysql (tức đặt mật khẩu cho root).
Với Centos thì bạn có thể dùng lệnh này để đặt mật khẩu cho root theo từng bước của nó: sudo mysql_secure_installation 

3. Tạo một user mới và cấp quyền
-
Chúng ta thường thao tác với database với đầy đủ các quyền, nhưng nhiều trường hợp chúng ta không muốn ai đó truy cập với quá nhiều quyền trong tay ( quá nguy hiểm quá ).
- Truy cập mysql: mysql -u root -p
-
Tạo user mới: 

CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
- newuser: tên user bạn muốn tạo.
- localhost: user chỉ được phép kết nối đến MySQL từ local host. Dùng ký tự % để cho phép user được phép truy cập từ bất kỳ máy nào. ( có thể dùng địa chỉ ip cụ thể ).
- password: mật khẩu đăng nhập user đó.

- Khi bạn tạo xong user thì user mới này chưa có quyền gì cả. Giờ mình phải cấp quyền cho nó.

GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost';

FLUSH PRIVILEGES;

- Dùng câu lệnh trên mình đã cấp full quyền cho nó, nghĩa là nó có thể thao tác tất cả các bảng trong cơ sở dữ liệu. Căng, như vậy thì không an toàn lắm.  
- Vì vậy câu lệnh sau sẽ giúp thiết lập quyền cụ thể cho user: 

GRANT [type of permission] ON [database name].[table name] TO ‘[username]’@'localhost’;

- Dưới đây là danh sách các lệnh thường dùng để gán quyền cho user.
+ ALL PRIVILEGES: lệnh này cho phép MySQL user thực hiện toàn quyền trên databases (hoặc 1 vài db được thiết lập) .
+ CREATE: Cho phép user tạo mới tables hoặc databases.
+ DROP: Cho phép xóa tables hoặc databases.
+ DELETE: Cho phép xóa bản ghi dữ liệu trong bảng tables.
+ INSERT: Cho phép thêm bản ghi mới vào bảng cơ sở dữ liệu
+ SELECT: Cho phép sử dụng lệnh Select để tìm kiếm dữ liệu.
+ UPDATE: Cho phép cập nhật cơ sở dữ liệu.
+ GRANT OPTION: Cho phép gán hoặc xóa quyền của người dùng khác.

- Để thu hồi quyền:

REVOKE [type of permission] ON [database name].[table name] TO ‘[username]’@'localhost’;

- Xóa một user nào đó: DROP USER 'user'@'localhost';
- Để chắc chắn các câu lệnh thực thi thì các bạn nhớ FLUSH PRIVILEGES nhé.
- Hiện thị quyền của một user: 
 SHOW GRANTS FOR 'newuser'@'localhost';
- Xem các user có trong mysql:  Select * from mysql.user;

4. Truy cập từ xa
* Để truy cập từ xa, hay truy cập tới mysql server của máy này từ một máy khác.

- Đảm bảo cổng được mở ( mặc định là cổng 3306, check xem cổng được mở ra chưa )
  Mình đưa ra một số cách để mở cổng trên server 
  C1: sử dụng firewall:  firewall-cmd --zone=public --add-port=3306/tcp --permanent
                                      firewall-cmd --reload
  C2: sử dụng ufw:        sudo ufw allow 3000/tcp
  Check port:                 netstat -lntu

- Đảm bảo rằng user mysql có thể truy cập được ( tức xem nó cho phép host nào được truy cập )

- Hoặc có thể thay đổi nội dung bind-address của file my.cnf từ localhost thành 0.0.0.0
Sau khi chuyển xong bạn cần chạy lệnh reset mysql: sudo /etc/init.d/mysql restart

5. Một số câu lệnh MySQL

Hiển thị toàn bộ databases:
mysql> SHOW DATABASES;
Tạo database:
mysql> CREATE DATABASE mydatabase;

Sử dụng một database:
mysql> USE mydatabase;

Xóa một database:
mysql> DROP DATABASE mydatabase;

Update cần tắt safe, update xong bật lại;
SET SQL_SAFE_UPDATES = 0; 
UPDATE 
SET SQL_SAFE_UPDATES = 1;
Cảm ơn các bạn đã đọc. Nếu thấy có ích thì share để mọi người cùng biết nhé. Thanks.

Botnet là gì? Vòng đời và phương thức hoạt động của Botnet.

 

I. Giới thiệu về Botnet.
1. Botnet là gì?

- Botnet thuật nghữ đầy đủ là "Bots network" dùng để chỉ một mạng lưới các máy tính bị chi phối và bị điều khiển từ xa bởi một máy tính khác. Botnet cũng có thể hiểu là một tập hợp các bot hoặc các con bot hoạt động một cách tự chủ.
Thông thường, một hệ thống botnet thường bao gồm các thành phần sau:
- Botmaster: là kẻ nắm quyền điều khiển các máy chủ C&C đưa ra lệnh cho các bot trong botnet.
- Command and Control Server (C&C Server): là máy chủ điều khiển các bot. Máy chủ này được dùng để phát ra các lệnh cho các bot trong mạng.
 - Bot: là các máy tính bị xâm nhập, bị cài phần mềm độc hại và chịu sự điều khiển của C&C Server.

2. Các dạng botnet.
    
Để phân loại botnet thì có thể phân loại dựa theo theo kiến trúc (kiến trúc tập trung, kiến trúc P2P, không cấu trúc), theo giao thức truyền thông (IRC, HTTP, P2P, DNS) hoặc theo cấu trúc liên kết (Topology).
    - Ở đây, mình sẽ phân loại botnet dựa trên cấu trúc liên kết Topology. Các topology khác nhau sẽ có những ảnh hưởng khác nhau đến độ phức tạp, độ trễ tin nhắn hay khả năng bị phát hiện của botnet. Ngoài ra, các topology có thể được tổ chức tập trung quanh một hoặc nhiều máy chủ C&C hoặc được tổ chức theo cơ chế phân tán không sử dụng máy chủ C&C. Các dạng botnet topology điển hình bao gồm: Star, Mutile-Server, Hierarchical và Random.
* Star Topology
    - Dạng botnet này bao gồm một trung tâm C&C ở trung tâm giao tiếp với toàn bộ  các bot. Mỗi bot sẽ nhận các chỉ thị trực tiếp từ server. Khi một máy tính bị xâm nhập, nó sẽ tự đăng ký với server C&C trung tâm và trở thành một phần của botnet.


- Ưu điểm:
    + Thiết kế đơn giản. 
   + Tốc độ trao đổi thông tin nhanh chóng giữa trung tâm CnC và các bot do chúng được kết nối trực tiếp với nhau.
- Nhược điểm:
    + Botmaster mất quyền kiểm soát trung tâm C&C thì nó sẽ mất quyền kiểm soát toàn bộ botnet.
   + Tất cả các bot đều kết nối với cùng một máy chủ C&C sẽ tạo ra rất nhiều lưu lượng truy cập đến một điểm duy nhất. Điều này rất dễ thu hút sự chú ý của cơ quan phát luật.
* Mutile-Server Topology
    - Multi-Server có thể được xem như một cấu trúc mở rộng của dạng Star. Thay vì sử dụng một máy chủ duy nhất, thì trong Multi-Server, nhiều máy chủ sẽ được botmaster sử dụng để quản lý botnet. Những máy chủ này cũng liên lạc với nhau trong quá trình quản lý botnet.


- Ưu điểm: 
     + Giảm khả năng bị phát hiện: việc phân bố các máy chủ C&C làm giảm lưu lượng truy cập tới cùng một địa chỉ, điều này sẽ giúp botmaster tránh khỏi sự kiểm soát của các cơ quan pháp luật.
    + Nếu bất kỳ một máy chủ C&C nào bị tấn công và vô hiệu hóa, botmaster vẫn có thể giữ được quyền kiểm soát botnet.
    + Đem lại hiệu quả cho mục đích kinh doanh: một số tội phạm mạng sẽ bán hoặc cho thuê một số phần của botnet cho các hoạt động bất hợp pháp.
- Nhược điểm:
    + Phức tạp khi triển khai, tốn chi phí, thời gian và công sức hơn.
* Hierarchical Topology
    - Trong cấu trúc này, thay vì sử dụng nhiều máy chủ C&C để quản lý botnet, botmaster chỉ sử dụng một máy chủ C&C duy nhất và kèm theo đó là một số bot khác hoạt động như proxy. Mỗi bot này đóng vai trò như một máy chủ C&C thứ cấp, cho phép các bot con khác kết nối tới nó và thông qua nó để giao tiếp với máy chủ trung tâm C&C.

- Ưu điểm:
    + Máy chủ C&C khó bị phát hiện hơn do không có bot nào nhận biết được tất cả các bot khác trong mạng botnet, địa chỉ của máy chủ C&C chỉ được một số bot biết đến.
    + Việc ước tính kích thước thực của mạng botnet trở nên khó khăn, khó kiểm soát và chiếm giữ mạng botnet hơn, vì chỉ có thể truy cập được một phần của nó và địa chỉ của máy chủ C&C chỉ được một số bot biết đến. Hơn nữa, cấu trúc liên kết này làm cho nó phù hợp với điều chỉnh các chiến thuật lan truyền khi số lượng botnet lan rộng.
    + Dễ dàng trong việc bán hoặc thuê botnet con.
- Nhược điểm:
    + Độ trễ cao, khó triển khai các hoạt động theo thời gian thực.
* Random Topology
    - Các cấu trúc liên kết được trình bày phía trên tập trung vào các mạng botnet có máy chủ C&C hoặc nhiều máy chủ C&C để kiểm soát botnet. Nhưng khác với  dạng trước. Cấu trúc ramdom là cấu trúc không tồn tại máy chủ C&C. Các bot hoạt động theo hình thức ngang hàng (P2P). Bất kỳ bot nào cũng có thể gửi hoặc nhận lệnh từ các bot khác. Khi một bot nhận được lệnh, nó sẽ truyền lệnh đến các bot hàng xóm của nó.

- Ưu điểm:
    + Khó để xác định kích thước tổng thể của botnet.
    + Không tốn chi phí đầu tư cho máy chủ C&C.
- Nhược điểm:
    + Nếu một bot bị phát hiện, rất dễ dàng truy ra vị trí của các bot khác liên lạc với nó.
    + Các lệnh truyền giữa các bot sẽ có độ trễ.
II. Vòng đời và phương thức hoạt động của Botnet
    - Thông thường, các giai đoạn hoạt động trong vòng đời của một botnet gồm: lây lan; tương tác và điều khiển; tấn công; và cập nhật và duy trì. Phần tiếp theo của mục này sẽ mô tả chi tiết từng giai đoạn hoạt động kể trên của botnet.
1. Lây lan
    - Khi thiết kế một mạng botnet, kẻ tấn công phải xem xét các cách để lây nhiễm máy của nạn nhân. Kẻ tấn công sẽ cố gắng tìm hiểu và khai thác các lỗ hổng bảo mật trên máy tính nạn nhân (các lỗ hổng này có thể được gây ra bởi các phần mềm độc hại trước đó, các ứng dụng, hoặc lỗi của hệ điều hành…). Botmaster sẽ cố gắng lừa người dùng tải xuống, cài đặt một số phần mềm hoặc tệp tin độc hại, từ đó tấn công vào lỗ hổng bảo mật trên thiết bị của nạn nhân. Bên cạnh đó, việc lây nhiễm cũng có thể được tiến hành một cách tự động bằng cách quét các mạng cho các lỗ hổng đã được biết đến trước đó.
    - Một máy tính nạn nhân có thể có rất nhiều lỗ hổng khác nhau, vì thế cũng có nhiều phương pháp khai thác khác nhau. Tùy vào mục đích cũng như các yếu tố liên quan, kẻ tấn công sẽ lựa chọn triển khai các biện pháp khai thác và lây nhiễm khác nhau. Bảng dưới đây tóm tắt một số phương pháp lây nhiễm được botmaster sử dụng và các yếu tố liên quan.

Mục tiêu

Độ phức tạp thiết kế

Khả năng bị phát hiện

Tốc độ lây nhiễm

Số lượng thiết bị lây nhiễm

Hệ điều hành

Trung bình

Cao

Thấp

Lớn

Ứng dụng

Trung bình

Trung bình

Trung bình

Trung bình

Dịch vụ

Cao

Thấp

Cao

Nhỏ

Con người

Thấp

Trung bình

Thấp

Lớn


2. Tương tác và điều khiển
    - Sau khi máy tính nạn nhân trở thành bot, nó sẽ giao tiếp với botmaster qua kênh truyền thông được sử dụng bởi botnet đó. Botmaster sẽ nhận được thông báo về sự lây nhiễm thành công cho một bot mới, và bot đó sẽ chờ đợi các hướng dẫn đến từ botmaster.
3. Tấn Công
    - Mục đích cuối cùng của một botnet chính là thực hiện một cuộc tấn công. Tính chất của một cuộc tấn công botnet chính là số lượng kẻ tham gia tấn công rất lớn. Một số cuộc tấn công phổ biến do các botnet tạo ra là:
    + Tấn công DDoS: Bằng cách ra lệnh cho các bot gửi đồng loạt các yêu cầu tới hệ thống, mục đích của những cuộc tấn công DDoS là nhằm phá vỡ tính sẵn dùng của dịch vụ, hệ thống đó. 
    + Gửi thư rác (spam): Các botnet được sử dụng để gửi thư rác bởi khả năng thay đổi nhanh chóng và dễ dàng từ các địa chỉ IP hợp pháp khác nhau.
    + Phishing: Tương tự như mục đích gửi thư rác, phishing là việc tội phạm mạng dựa vào tính linh hoạt của địa chỉ IP được cung cấp bởi botnet để thực hiện hành vi lừa đảo. Nếu một trang web lừa đảo bị gỡ xuống, ngay lập tức một bản sao của nó sẽ nhanh chóng được dựng lại.
    + Click Fraud: Dạng tấn công này liên quan tới việc tăng doanh thu cho bên thứ 3 bằng hành vi kích chuột vào trang quảng cáo trực tuyến hoặc truy cập vào trang web. 
   + Đánh cắp thông tin: Các bot có thể đánh cắp thông tin trên mạng và cả trên máy tính nạn nhân (bot). Điều này sẽ giúp cho botmaster có thể thu thập được các thông tin quan trọng và nhạy cảm của người dùng.
     + Lây nhiễm các phần mềm độc hại.
4. Cập nhật và duy trì
    - Sau khi thực hiện tấn công, các bot trở về trạng thái chờ lệnh. Botmaster sẽ cập nhật cho các bot thường xuyên để tránh các kỹ thuật phát hiện mới, hoặc vá các lỗi hay bổ sung thêm tính năng mới cho bot. Trong suốt thời gian này, các bot cần được giám sát thường xuyên để đảm bảo cho hệ thống hoạt động bình thường.

Cảm ơn mọi người đã đọc bài viết mình nhé!