Skip to content

Cơ bản về Nguyễn Hồng Sơn

Nếu các bạn lần đầu biết tới tôi thông qua các thủ thuật stalk, đây là trang cung cấp vừa đủ cho các bạn. Hoặc, bạn là bạn tôi, và bỗng dưng một ngày nào đó bạn muốn giới thiệu tôi với ai đó, hoặc ai đó hỏi bạn về tôi, hãy cho họ xem mấy dòng này. Nếu bạn chỉ ghé qua để tuyển dụng, hãy xem ở đây, bỏ qua các phần dưới đi, nó không cần thiết để một HR phải phí thời gian (hoặc bạn sẽ reject tôi nếu lỡ biết quá nhiều).

Tới từ vùng quê hơi nghèo ở Nghệ An, tôi học đại học và sống sót ở Thành phố Hồ Chí Minh nhiều năm. Cuộc sống hơi khó khăn, hoặc tôi bịa ra chúng nhưng tôi là người thích đương đầu với những thách thức (nhưng đừng khó quá). Cả bố và mẹ tôi đều không còn. Gia đình tôi có hai anh em, anh trai lớn hơn tôi gần 20 tuổi, đã lập gia đình và có con ở quê.

Tôi là một người sôi nổi, ham vui. Tôi học ở Trường Đại học Công nghệ Thông tin, ĐHQG-HCM2, chuyên ngành An toàn Thông tin. Tôi cũng sắp có bằng Thạc sỹ cùng chuyên ngành tại đây. Tôi có thời sinh viên hoạt động Đoàn - Hội sôi nổi và có nhiều thành tựu, trong đó tự hào nhất là tôi có những người bạn, người em tốt, còn chịu chơi với đứa khó ở như tôi tới tận giờ. Tôi trân trọng những người sống vì cộng đồng, giữ chữ tín và coi đó là mục tiêu sống của mình, có phần là động lực để phấn đấu. Tôi đã tham gia một số chương trình tình nguyện, tham gia hiến máu liên tục nhiều năm, tới nay khoảng hơn 20 lần.

Công việc hiện tại của tôi là một kỹ sư hệ thống, làm tại một tập đoàn khá lớn1. Nếu bạn là dân IT, đơn giản hiểu nó là System Admin, SRE, DevOps hay bất cứ cái role nào của công ty định nghĩa để gọi cái thằng cấp máy ảo và cài tool monitor ấy. Nếu bạn không phải dân IT, cứ hiểu rằng không có tôi thì ứng dụng bạn không chạy được, hoặc lúc chạy lúc chết. Nếu chưa hiểu nữa thì thôi, tạm biệt, hãy học IT để hiểu chứ tôi chịu. Tôi cũng có ý định làm cái việc khác nhưng hiện tại thì chưa thể, nên tôi sẽ để đây chừng nào ngon lành thì cập nhật (hoặc dấm dúi luôn nếu thất bại).

Tôi có cuộc sống khá tích cực, mặc dù gần đây có lười biếng. Tôi tham gia giải leo núi được vài lần, đã hoàn thành một lần và cố gắng trong những lần tiếp theo. Tôi đã cố gắng tham gia một giải chạy bộ và hoàn thành 21 km, hiện nay tôi khó làm được nữa nhưng vẫn lấy đó là mốc huy hoàng để quay trở lại. Giống như vô vàn cái tiểu sử chém gió, tôi thích đọc sách. Tôi đọc tiểu thuyết văn học, các tác phẩm kinh điển. Thi thoảng tôi nghiên cứu triết học và chính trị, tôi là một người theo chủ nghĩa Cộng sản. Các tác phẩm như: Ba người lính ngự lâm, Sapiens, Homo Deus, Bá tước Monte Cristo, Thép đã tôi thế đấy, Rừng Na-uy... để lại ấn tượng mạnh trong tôi. Tôi hay đăng các bài viết thật dài bên đây lên facebook lấy fame sau những ngày ít đăng ảnh. Mọi người bình luận nhiều, so với một bài đăng toàn chữ như vậy thì rất ổn.

Bởi sống tích cực nên tôi khá là nhiều chuyện (với người quen thôi). Tôi thích nghe các câu chuyện trên trời dưới đất, tình yêu cuộc sống, các kiểu. Tôi hay khuyên người ta chia tay hoặc cưới, tiếp tục học hoặc bỏ, làm giàu hay làm thinh... Nói chung là khả năng nghe của tôi tỷ lệ thuận với khả năng nói đấy. Nên các bạn ai muốn dốc bầu tâm sự thì cứ nhắn tin, hẹn gặp tôi. Tôi hứa không cười vào mặt các bạn.

Sơn


  1. Nhưng lương thấp. 

  2. Trường Đại học Công nghệ Thông tin ĐHQG-HCM. Trường đại học công nghệ thông tin. 2024. URL: https://www.uit.edu.vn/ (visited on 2024-09-22). 

Nhật ký Anne Frank

Quote

Bài viết cuối cùng trong nhật ký của Anne đề ngày 1 tháng Tám năm 1944. Vào ngày 4 tháng Tám năm 1944, tám người ẩn náu trong Nhà phụ Bí mật đã bị bắt. Miep Gies và Bep Voskuijil, hai cô thư ký làm việc trong tòa nhà, tìm thấy những cuốn nhật ký của Anne vứt tung tóe trên bàn làm việc. Sau chiến tranh, khi đã có xác nhận rõ ràng là Anne đã chết, cô đưa những cuốn nhật ký mà cô chưa hề đọc cho cha của Anne ông Otto Frank.

Quote

Anne Frank, khi bắt đầu viết nhật ký mới mười ba tuổi, và mười lăm khi buộc phải dừng viết, đã viết không chút e dè về những gì mình thích hay không thích.

Anne là một cô gái, hay nói đúng hơn là một em gái nhỏ người Do Thái. Do bị truy lùng gắt gao, cô cùng gia đình và một số người khác đã di chuyển tới Hà Lan và ẩn náu tại đó khoảng từ giữa nă 1942 đến khi bị bắt.

Anne là một người bình thường theo cách không thể bình thường hơn. Toàn bộ cuốn nhật ký, giống như lời giới thiệu, là lời của cô nói về những gì cô thích hay ghét. Một cô gái tuổi mới lớn biết bao hoài bão, yêu thích đọc sách, học hành lại bị o bé trong căn phỏng nhỏ, đã có nhiều nỗi lòng không thể giải tỏa và mang nó vào cuốn nhật ký. Anne thậm chí đã viết thư trách móc cha mình vì ông khuyên cô không nên quá gần gũi với Peter (một người con trai trạc tuổi cùng ấn náu tại nhà phụ).

Quá nửa đầu cuốn nhật ký, là những dòng than vãn dài đằng đẵng, kể về sự khó khăn khi phải tự giải quyết những mâu thuẫn của bản thân, sự hời hợt của người mẹ, mâu thuẫn và mô tả về tính cách của những người trong Nhà phụ, việc miếng cơm manh áo trong thời chiến... Khó mà tưởng tượng nổi những khó khăn mà Anne phải tự đối mặt, khó có thể hiểu nổi khao khát nhìn bầu trời đêm nếu chúng ta không từng trải qua hoàn cảnh tương tự. Nghĩ về thời sống cách ly do dịch bệnh, tôi cảm thấy mình như trải qua những gì Nelson Mandela đã nói: "Những ngày trong tù, Nhật ký của Anne Frank đã khích lệ tôi rất nhiều."

Nửa sau, Anne thực sự đã trưởng thành. Những câu chuyện mặc dù vẫn còn trẻ con, than vãn nhưng đã phảng phất và sau đó, dành hẳn mấy trang để thấu hiểu cho những con người đáng thương trong Nhà phụ. Quả thực Anne đã trưởng thành trong chính hoàn cảnh khó khăn đó, như bông hoa nở giữa vách đá vậy. Mối tình con con với Peter cũng đã giúp đỡ cô rất nhiều. Anne cảm thấy mình bị phân rã thành hai con người, mỗi mặt thể hiện một trạng thái khác nhau. Cô khóc vì cô đôi khi không phải là chính mình như cô muốn

Mặc dù đầy sự than thở, nhưng Anne chưa bao giờ mất niềm tin về cuộc sống của mình. Cô tự tin bản thân mình độc lập, tin về thời đại mới của phụ nữ, tin rồi một ngày quân Đức sẽ bị đánh bại, tin vào Thiên chúa. Cô tin vào sứ mệnh của người phụ nữ, tư tưởng vượt thời đại về vấn đề sinh con. Cô tin rằng phụ nữ thật cao cả khi không than vãn hay nô nức tự hào khi đảm nhận vai trò duy trì thế hệ kế tiếp. Nhưng như cô đã nói, tự nhiên hay chính Thiên chúa đã trao cho phụ nữ năng lực đó, cô không bảo phụ nữ thôi sinh nở, nhưng cô sẽ chiến đấu và mong rằng tư tưởng của xã hội sẽ thay đổi, công nhận vinh quang bình thường này của phụ nữ. Phụ nữ phải được tôn trọng.

nhat-ky-anne-frank

Thậm chí cô hiểu câu chuyện, rằng người Anh, Mỹ không tự nhiên tổ chức "D Day" khi họ không chắc thắng. Cô phê bình những người dân Hà Lan không biết tự đấu tranh cho chính dân tộc mình (Hà Lan lúc này đã bị Đức chiếm đóng, chính phủ Hà Lan lưu vong ở Anh), chỉ trông chờ vào sự cứu rỗi ở bên ngoài.

Quote

Cố thủ trong pháo đài Nhà phụ Bí mật, chúng tớ khó lòng đoán biết được tâm trạng của người dân Hà Lan lúc này. Chắc chắn là nhiều người vui mừng vì những người Anh lười biếng [!] cuối cùng đã xắn ống tay áo lên mà bắt tay vào làm việc. Những người luôn miệng kêu rằng họ không muốn bị quân Anh chiếm đóng không nhận ra rằng họ đang bất công đến mức nào. Lập luận của họ chung quy lại thì là thế này: nước Anh phải tham chiến và hy sinh những người con của họ để giải phóng Hà Lan và những nước bị xâm lược khác. Sau đó quân Anh không được ở lại Hà Lan nữa: họ nên khúm núm xin lỗi tất cả các nước bị xâm lược, trả lại xứ Đông Ấn Hà Lan cho chủ sở hữu chính đáng rồi quay trở về Anh trong hoàn cảnh suy yếu và kiệt quệ. Đúng là một lũ ngốc. Thế nhưng, như tớ đã từng nói, nhiều người Hà Lan có tư tưởng như vậy. Hà Lan và các nước lân cận sẽ ra sao nếu như trước kia Anh ký hiệp ước hòa bình với Đức, vì nó có quá nhiều cơ hội để làm vậy? Hà Lan sẽ trở thành một phần của Đức, và thế là hết!

Xuyên suốt những dòng nhật ký, ta thấy một cô bé trưởng thành qua từng trang sách, nói những vấn đề triết lý nhân sinh thú vị, kể về những mâu thuẫn mà một gia đình, nếu trong hoàn cảnh phải sống bí mật trong không gian chật hẹp như vậy chắc chắn sẽ mắc phải.

Tự do, hay hòa bình là vô giá. Anne trong sách chỉ ao ước được thấy bầu trời đêm, được hòa mình trong thiên nhiên nhưng cuối cùng không được trọn vẹn. Cô đã chết trong những chuyến vận chuyển tù nhân giữa các trại tập trung. Hãy sống đời tự do trong hòa bình của đất nước và tận hưởng khí trời tới tận ngày nhắm mắt xuôi tay, như vậy thì cuộc đời ta cũng đã trọn vẹn, dù cho đôi điều mộng tưởng còn giang dở.

Những việc nhỏ nên làm ngay

Tiêu đề bài viết do người viết phỏng đặt dựa theo những bài viết của Cố Tổng bí Thư Nguyễn Văn Linh1

Sinh thời, đồng chí Cố Tổng Bí thư Nguyễn Phú Trọng có bài viết Một số vấn đề lý luận và thực tiễn về chủ nghĩa xã hội và con đường đi lên chủ nghĩa xã hội ở Việt Nam2. Gần đây, mình được tặng một cuốn sách có tựa đề A history of God3. Cả hai tác phẩm này theo mình thấy, có một điểm chung rằng mặc dù là những nhà nghiên cứu rất có kinh nghiệm trong lĩnh vực của mình, nhưng khi trình bày vấn đề thì tác giả chỉ đề cập là "một" hay "một số" rất khiêm tốn chứ không hề có ý bao hàm tất cả. Trong bài thi viết của đạt giải của tôi, việc đề cập đến là việc sinh hoạt tại Chi bộ, là việc tôi tiếp xúc và hiểu rõ những vấn đề còn hạn chế.

Bởi thế, tôi cho rằng, trước khi bàn những chuyện đao to búa lớn, Đảng viên và Chi bộ nên tùy tình hình, nhiệm vụ chính trị tại nơi mình công tác mà nêu ý kiến, đề xuất phù hợp. Kỳ kiểm điểm năm ngoái, tôi tự nhận thấy bản thân mình còn chưa tích cực, cả nể, chưa dám thấy đúng không giám bảo vệ, thấy sai không dám đấu tranh. Năm nay nhìn chung đã mạnh dạn và đưa ra nhiều ý kiến, hầu hết đúng nơi, đúng chỗ, mang tính xây dựng.

Tuy vậy, các ý kiến, đề xuất vẫn chưa được áp dụng và chưa thuyết phục được các đồng chí mà tôi thì phải chuyển công tác theo quy định.

Vấn đề về lắng nghe ý kiến sinh viên

Hồ Chủ Tịch khi bàn về Thanh niên Trung Quốc đã nhận định: "Chỉ có tầng lớp sinh viên là có thể nghe thấy những hồi âm của phong trào cách mạng của phương Tây. Chỉ có họ mới có thể nhìn thấy, suy ngẫm, so sánh và hiểu được vấn đề"4. Nhận định này tôi cho rằng đúng với sinh viên Việt Nam và vẫn còn đúng trong thời đại ngày nay.

Các Đại học (Trường Đại học) hiện nay đào tạo sinh viên đã dần tiệm cận với các tiêu chuẩn quốc tế. Mỗi trường, tùy theo tình hình đã xây dựng các triết lý, sứ mạng, tầm nhìn, giá trị cốt lõi bao gồm nhiều khía cạnh, trong đó không ít cơ sở lấy hội nhập, toàn diện, đa văn hóa là một trong những thước đo quan trọng. Sự tự học hỏi, tự nghiên cứu, phản biện đã trở thành một phần không thể thiếu trong bộ kỹ năng của sinh viên.

Mặc dù kỹ năng và kiến thức ngày càng cao, nhưng sinh viên vẫn còn thiếu sót ở một số điểm.

  • Một là, số đông sinh viên vẫn còn học tập và sinh hoạt bằng trợ cấp từ gia đình, chưa thông qua lao động sản xuất để tạo nên thặng dư, vì vậy chưa hiểu hết những mâu thuẫn trong quan hệ sản xuất.

  • Hai là, sinh viên có khao khát tìm hiểu tri thức mới, nhưng khả năng tư duy chưa hoàn thiện như một nhà nghiên cứu thực thụ, vì vậy dễ bị thiên kiến, một chiều, chưa đi sâu vào bản chất của vấn đề mà chỉ nhìn hiện tượng để đánh giá.

  • Ba là, nhu cầu tìm kiếm sự công nhận, sự bất mãn khi nhìn thấy những bất công không chỉ đối với bản thân mà đối với cả những khiếm khuyết còn tồn tại bên ngoài xã hội, vốn rất dễ tìm kiếm và tiêu thụ trong môi trường mạng xã hội, không gian số hiện nay.

  • Bốn là, do sự phát triển của các nền tảng truyền thông xã hội, nền kinh tế dựa trên sự chú ý tác động đến nhận thức về xã hội của một bộ phận của tầng lớp sinh viên nói riêng, giới trẻ nói chung. Khả năng diễn đạt và trình bày vấn đề trực tiếp bị thu hẹp, chuyển dịch dần sang các phương thức gián tiếp như mạng xã hội, email, tin nhắn văn bản, nhãn dán thể hiện cảm xúc, ưu tiên các phương thức ẩn danh... Viêc trình bày vấn đề trực tiếp tới người phụ trách, tổ chức chịu trách nhiệm không được thực hiện, thay vào đó tìm kiếm sự đồng cảm trên các phương tiện gián tiếp.

  • Cuối cùng, một bộ phận cán bộ, viên chức, người lao động làm nhiệm vụ tiếp nhận ý kiến, hoặc thực hiện các công việc mà sự bắt đầu, quá trình thực hiện, kết quả có sự liên quan tới sinh viên chưa tạo điều kiện cho sinh viên nói lên ý kiến của mình. Các quy trình, quy định hoặc không rõ ràng, hoặc được đề cập rõ ràng nhưng người xử lý nó thực hiện theo quy trình kinh nghiệm, không xem xét các yếu tố thay đổi của chính sách và đối tượng tiếp xúc. Bản thân sinh viên nói riêng, công dân nói chung khi làm việc với thầy cô, giảng viên, cơ quan quản lý thường ở vị trí yếu thế. Họ không có đủ trình độ (như đã nêu các điểm trên), hoặc không có đủ tài nguyên, hoặc còn kiêng sợ, ngại va chạm. Sự bình đẳng về quyền nhưng không kèm theo sự bình đẳng về điều kiện để thực hiện các quyền đó đã dẫn đến dân chủ vẫn chỉ là hình thức, trống rỗng mà không thực chất2.

Quá trình công tác đoàn thể và làm việc, tôi nhận thấy một ý kiến phản hồi đưa ra không ngoài hai mục đích: hoặc nó ảnh hưởng tới lợi ích của người nêu ý kiến hoặc chính họ là người có nhiệm vụ/nghĩa vụ/quyền nêu ý kiến không vì lợi ích thuần túy. Việc lấy ý kiến của sinh viên đã được triển khai và có hiệu quả thực chất. Thông qua các phiếu đánh giá cũng như hội nghị lấy ý kiến, các quan điểm, góc nhìn của sinh viên đã được phản ánh và đi vào chính sách.

Phương thức lấy ý kiến cần phù hợp, phải tạo ra mong muốn đóng góp của đối tượng được lấy ý kiến. Muốn đạt được điều này cần đảm bảo cả hai yếu tố:

  • Về mặt hình thức, phương tiện lấy ý kiến cần thể hiện thành ý, mong muốn của người lấy ý kiến đối với người được lấy ý kiến. Một sản phẩm đồ họa, một ứng dụng di động, một trang điện tử được thiết kế đẹp đương nhiên sẽ khơi gợi, mơn trớn cảm xúc của người được lấy ý kiến hơn là một thư điện tử toàn chữ, kèm theo một đường dẫn tới google biểu mẫu. Sự lấy ý kiến có thể là chủ động như gửi phiếu điền, hoặc thụ động như số liệu tiếp cận, tỉ lệ tương tác, thời gian truy cập ứng dụng, vùng nội dung mà người được lấy ý kiến tập trung. Về mặt kỹ thuật, các công cụ hiện đại đã đáp ứng được các yêu cầu này. Một phương pháp tốn kém hơn là kèm các hình thức tuyên dương, khen thưởng khi đối tượng được lấy ý kiến bày tỏ quan điểm của họ. Hầu hết các trang thương mại điện tử đã áp dụng chính sách này.

  • Về mặt nội dung, các vấn đề được xin ý kiến phải rõ ràng, dễ đọc, dễ hiểu, tốt nhất là các vấn đề ảnh hưởng tới đời sống, sinh hoạt, học tập của họ. Các câu hỏi lấy ý kiến cần ngắn gọn, mang tính lượng hóa như chấm điểm, phần trăm... Các vấn đề lấy ý kiến không mang tính vỹ mô, cần nhiều công sức tìm hiểu mới có thể đánh giá thì không lấy ý kiến. Các vấn đề mà ý kiến của người lấy ý kiến không quan trọng, hoặc không thể đóng góp thì cũng không lấy ý kiến. Nếu vấn đề đó cần phải lấy ý kiến, thì cần thông qua bước trung gian để cụ thể hóa nó thành các câu hỏi mà đối tượng lấy ý kiến có thể trả lời. Thay vì hỏi "Các ý kiến đóng góp Chiến lược phát triển" thì nên chia thành các câu hỏi nhỏ hơn như: "Nhằm nâng cao năng lực nghiên cứu khoa học và công bố quốc tế, đâu là ưu tiên mà nhà trường nên tập trung (chọn tối đa 2) A: Xây dựng môn học về kỹ năng viết bài báo cho sinh viên. B: Mua bản quyền các thư viện bài báo khoa học cho sinh viên dùng chung. C: Cải thiện trang thông tin các hướng nghiên cứu sẵn có của nhà trường. D: Tăng nguồn kinh phí hỗ trợ cho giảng viên, sinh viên, lập danh mục các tạp chí được trường tài trợ chi phí nộp bài báo. E: Phát triển các lĩnh vực nghiên cứu mới hoặc liên kết để thực hiện khoa học liên ngành.

  • Về mặt tiếp thu, cần xác định rõ, bất kỳ ý kiến nào cũng có cái đúng của nó. Nếu ý kiến hoàn toàn sai thì thông qua cái sai đó mà ta nhận diện được đâu là cái đúng, chính là hạt nhân hợp lý của ý kiến đó. Nếu ý kiến đó đúng một phần, là cái riêng của trường hợp người ý kiến thì đương nhiên trong đó sẽ tồn tại một cái chung mà các trường hợp khác sẽ mắc phải. Sau khi tiếp nhận ý kiến đóng góp, cần tiếp thu những cái hợp lý, phản hồi những cái chưa hợp lý cho người ý kiến. Thông qua đó giúp người ý kiến hiểu rõ quan điểm lãnh đạo, chỉ đạo, thông tin mới, lý luận phù hợp của người được ý kiến. Thông qua hoạt động như vậy, người ý kiến phát triển trình độ tư duy, khả năng diễn đạt, từ đó có ý kiến mới hơn. Các quan điểm tiếp thu thì cần phải cảm ơn, tuyên dương người ý kiến. Các quan điểm chưa tiếp thu thì cần phải giải thích rõ, làm tới cùng lập luận. Tránh tình trạng kết luận một chiều, không dẫn chứng, phản biện.

Vấn đề nói đi đôi với làm, gương mẫu trong thực hiện chính sách

Đảng viên đi trước, làng nước theo sau5; Một tấm gương sống còn có giá trị hơn một trăm bài diễn văn tuyên truyền6; Trước mặt quần chúng, không phải ta cứ viết lên trán chữ "cộng sản" mà ta được họ yêu mến7.

Trước khi thực hiện tuyên truyền tới quần chúng, bản thân người tuyên truyền phải là một tấm gương mẫu mực. Một người đáng tin rõ ràng sẽ làm cho những điều họ nói đáng tin. Không những người nói đó đáng tin, mà bộ phận, tổ chức do người đó đại diện/là thành viên cũng phải gương mẫu như vậy. Quần chúng nói chung và sinh viên nói riêng quan tâm tới những điều chung quanh họ, trước khi quan tâm tới những sự việc, sự kiện khác. Chúng ta không thể vừa tuyên truyền tuân thủ pháp luật về giao thông, vừa thể hiện bản thân mình quen biết đồng chí này, đồng chí kia ở cơ quan công an. Chúng ta không thể vừa tuyên truyền nâng cao vai trò của y tế cơ sở, vừa thông báo rằng ta đủ giàu để bất kỳ bệnh nào cũng lên khám ở tuyến Tỉnh, tuyến Trung Ương.

Một đồng chí Bí thư tham gia chương trình đạp xe đồng hành, đi được vài trăm mét đã dừng lại, lên xe ô tô để đi tới đích thì không thể làm gương, không đủ năng lực chỉ đạo tuyên truyền được.

Làm gương, làm mẫu là vấn đề còn tồn tại qua nhiều thời kỳ. Việc người tuyên truyền, làm chính sách chưa gương mẫu, chưa đi đôi với làm không phải nay mới có, không phải chỉ xuất hiện trong mỗi đơn vị ta, nhà nước ta, thời kỳ ta. "Tu thân, tề gia, trị quốc, bình thiên hạ", Khổng Tử đã chỉ ra từng bước mà việc đầu tiên cần làm là tự rèn luyện, tu dưỡng. Vai trò của tổ chức là thường xuyên nhắc nhở, phê bình các cá nhân chưa gương mẫu, chưa nói đi đôi với làm. Việc làm gương phải bắt đầu từ lãnh đạo đơn vị và chỉ có thể bắt đầu từ lãnh đạo đơn vị.

Việc nâng cao tính thống nhất giữa lời nói và hành động trong đội ngũ quản lý, tuyên truyền tôi chưa tìm tòi được giải pháp hiệu quả nào. Chỉ có thể thông qua vài hiện tượng, biểu hiện mà phê bình chính những đồng chí trong tổ chức của tôi. Xin nêu ra để nhận diện vấn đề và cùng tìm giải pháp.

Vấn đề quần chúng hóa quan điểm, tập thể hóa lý luận

Các quan điểm đúng đắn chưa được quần chúng hóa, kể cả trong tập thể chi bộ. Nhiều chủ trương, chính sách được phổ biến chưa tới, chưa kỹ, chưa rõ. Các tổ chức làm nhiệm vụ tuyên giáo chưa đưa ra được kịch bản tuyên truyền phù hợp với từng đối tượng. Đảng viên chưa vững kinh nghiệm chưa trả lời thống nhất trong cùng câu hỏi, dẫn tới quần chúng nghi ngờ lý luận, phản đối chính sách. Ví dụ tạo sao phạt cao, tại sao phạt thấp, nguyên nhân do đâu?

Về vấn đề này, tôi thật đáng buồn mà trích dẫn một trường hợp tội phạm. Các đối tượng có trong tay thông tin và một kịch bản bám sát tình hình thời sự trong nước, những vướng mắc mà người dân gặp8. Bản thân cán bộ ta có lúc, có nơi chưa làm được như những đối tượng này. Trong tuyên truyền chính sách, ta đi sâu vào phân tích nội hàm, tư tưởng của đường lối, nghị quyết, chính sách, pháp lệnh, nghị định, thông tư nhưng chưa nắm bắt được quần chúng nhân dân quan tâm điểm nào trong đó. Ta chưa định hướng được điểm chú ý của nhân dân vào điều cốt lõi của chính sách, ta chạy theo "dọn bãi chiến trường" khi chính sách bị xuyên tạc, và rồi ta lại lên hàng chục, hàng trăm bài cảnh báo, đấu tranh.

Ví dụ, khi giải thích quy định mới tăng mức phạt, tôi chỉ thấy các đơn vị truyền thông điểm khác nhau giữa trước và sau, rằng luật đã có từ lâu, chỉ thay đổi mức phạt, tôi không thấy trình bày cặn kẽ về quan điểm, tầm nhìn, nguyên nhân, kỳ vọng hiệu quả của chính sách.

Tôi cho rằng, giải thích chính sách này theo hướng thiên về văn hóa - xã hội hơn là kinh tế. Trước hết, ta khái quát vài nét về văn hóa giao thông hiện tại, sau đó ta chỉ ra nguyên nhân, ta trình bày quan điểm chính sách, dùng vài số liệu để chứng minh. Sau cùng là nói đến lợi ích và hiệu quả chính sách kỳ vọng.

Nhìn chung, hoạt động giao thông ở Việt Nam phản ánh một phần văn hóa Việt Nam. Người tham gia ưu tiên sự thuận tiện, dễ dàng, tự phát. Phép vua thua lệ làng, một trăm cái lý không bằng một tí cái tình. Dù đa số tuân thủ, một vài trường hợp hậu quả nặng thì viện dẫn cái tình để không tuân thủ cái lý. Vì vậy, việc áp dụng chính sách mới nhằm nâng cao ý thức tuân thủ lý tính, từ đó nâng cao ích lợi cho tập thể xã hội chứ không riêng cho đối tượng nào. Trước và sau khi áp dụng nghị định 100/2019/NĐ-CP, tỉ lệ vi phạm và các số liệu khác đã phát triển theo chiều tốt lên (cần viện dẫn). Từ đó tin tưởng rằng, với chính sách mới tiếp tục nâng cao ý thức tham gia giao thông của người dân.

Quan điểm này cần phổ biến cho bản thân người tham gia công tác tuyên truyền, tùy từng đối tượng mà người đó có diễn đạt, trích dẫn phù hợp. Các tổ chức đoàn thể cần có bộ kịch bản để trả lời thống nhất cho từng trường hợp cụ thể.

Với các quan điểm lớn như tầm nhìn chiến lược, nghị quyết về phương hướng, cần chỉ ra những lựa chọn chính sách hoặc nguồn gốc góc nhìn. Tại sao chúng ta chọn công nghiệp, công nghệ, sản xuất chip mà không chọn dịch vụ, giải trí, gia công. Như vậy, các thành phần trong hệ thống mới rõ vai, thuộc bài, theo khả năng của mình mà thực hiện. Vì tư tưởng định hướng, chỉ đạo hành động. Có quần chúng hóa quan điểm, tập thể hóa lý luận thì hoạt động thực tiễn mới chung hướng, phát triển đi lên.

Cũng giống như vấn đề gương mẫu, vấn đề quần chúng hóa quan điểm còn lớn lao hơn. Bản thân tôi chưa đủ khả năng để mô hình hóa ra được một giải pháp cụ thể nào, đành tiếp tục nêu ra để suy nghĩ và cùng tìm giải pháp.


  1. Báo Nhân Dân. Đồng chí nguyễn văn linh và những việc cần làm ngay trên báo nhân dân. 2025. URL: https://special.nhandan.vn/TBT-Nguyen-Van-Linh-va-Nhung-dieu-can-lam-ngay/index.html (visited on 2025-02-03). 

  2. Nguyễn Phú Trọng. Một số vấn đề lý luận và thực tiễn về chủ nghĩa xã hội và con đường đi lên chủ nghĩa xã hội ở việt nam. 2021. URL: https://nhandan.vn/mot-so-van-de-ly-luan-va-thuc-tien-ve-chu-nghia-xa-hoi-va-con-duong-di-len-chu-nghia-xa-hoi-o-viet-nam-post646305.html (visited on 2025-02-03). 

  3. Karen Armstrong. A History of God: The 4000-Year Quest of Judaism, Christianity, and Islam. A.A. Knopf, New York, first american edition edition, 1993. 

  4. Hồ Chí Minh. Hồ Chí Minh Toàn tập, chapter Trung Quốc và thanh niên Trung Quốc, pages 451–494. Volume 2. Nhà xuất bản Chính trị quốc gia - Sự thật, Hà Nội, 2011. URL: https://hochiminh.vn/book/tac-pham-cua-ho-chi-minh/ho-chi-minh-toan-tap/ho-chi-minh-toan-tap-tap-2-269 (visited on 2025-02-03). 

  5. Hồ Chí Minh. Hồ Chí Minh Toàn tập, chapter Nâng cao đạo đức cách mạng, quét sạch chủ nghĩa cá nhân, pages 546–548. Volume 15. Nhà xuất bản Chính trị quốc gia - Sự thật, Hà Nội, 2011. URL: https://hochiminh.vn/book/tac-pham-cua-ho-chi-minh/ho-chi-minh-toan-tap/ho-chi-minh-toan-tap-tap-15-282 (visited on 2025-02-06). 

  6. Hồ Chí Minh. Hồ Chí Minh Toàn tập, chapter Thư gửi đồng chí PêTơRốp, Tổng thư ký ban phương Đông, pages 284–285. Volume 1. Nhà xuất bản Chính trị quốc gia - Sự thật, Hà Nội, 2011. URL: https://hochiminh.vn/book/tac-pham-cua-ho-chi-minh/ho-chi-minh-toan-tap/ho-chi-minh-toan-tap-tap-1-266 (visited on 2025-02-07). 

  7. Hồ Chí Minh. Hồ Chí Minh Toàn tập, chapter Bài nói chuyện trong buổi bế mạc Hội nghị cán bộ của Đảng lần thứ Sáu, pages 15–17. Volume 6. Nhà xuất bản Chính trị quốc gia - Sự thật, Hà Nội, 2011. URL: https://hochiminh.vn/book/tac-pham-cua-ho-chi-minh/ho-chi-minh-toan-tap/ho-chi-minh-toan-tap-tap-6-273 (visited on 2025-02-07). 

  8. Nguyễn Ngân. Vụ lừa đảo gần 1.000 tỷ đồng: các đối tượng bám sát tình hình trong nước để lên kịch bản. 2025. URL: https://vtv.vn/phap-luat/vu-lua-dao-gan-1000-ty-dong-cac-doi-tuong-bam-sat-tinh-hinh-trong-nuoc-de-len-kich-ban-20250205145721598.htm (visited on 2025-02-07). 

Kubernetes Certified KCNA Learning

Đây là một số ghi chú của tôi trong khóa học Kubernetes Certified (KCNA) + Hands On Labs + Practice Exams on Udemy. Nó không bao gồm toàn bộ và không thể thay thế khóa học của tác giả. Hãy mua khóa học và tự trải nghiệm.

Tài nguyên thực hiện lab

Tác giả có thiết kế một môi trường lap theo mình thấy là rất tốt và cực kỳ dễ triển khai. Môi trường lab được giới thiệu ở phần 4 và hoàn toàn miễn phí để có thể sử dụng. Các bạn chỉ cần pull code từ một public repository về và chạy, tùy theo hệ điều hành. Link: https://github.com/spurin/diveintokcna

Section 1: Course and Cloud Native Introduction

Cloud native và Foundation

Question

Cloud Native nghĩa là gì?

  • Một ứng dụng có tính cloud native nghĩa là nó có thể triển khai được trên tất cả các nền tảng cloud bao gồm Public, Private và Hybrid Clouds

Question

Tầm quan trọng của Linux Foundation đối với Cloud Native là gì?

  • Linux Foundation là một tổ chức phi lợi nhuận, được tài trợ với nhiệm vụ quản lý và bảo trì các project quan trọng như Linux Kernel, Kubernetes và Cloud Native Foundation.

Kubernetes and Cloud Native Associate Certification

Đây là một bài thi trắc nghiệm. Thang điểm và cấu trúc nội dung của KCNA được chia thành các phần như hình dưới.

pie title KCNA Curriculum
    "Kubernetes Fundamentals" : 46
    "Container Orchestration" : 22
    "Cloud Native Architecture" : 16
    "Cloud Native Observability" : 8
    "Cloud Native Application Delivery" : 8
Kubernetes Fundamentals
  • Kubernetes Resources
  • Kubernetes Architecture
  • Kubernetes API
  • Containers
  • Scheduling
Container Orchestration
  • Container Orchestration Fundamentals
  • Runtime
  • Security
  • Networking
  • Service Mesh
  • Storage
Cloud Native Architecture
  • Autoscaling
  • Serverless
  • Community and Governace
  • Roles and Personas
  • Open Standards
Cloud Native Observability
  • Telemetry & Observability
  • Prometheus
  • Cost Management
Cloud Native Application Delivery
  • Application Delivery Fundamentals
  • GitOps
  • CI/CD

Chi phí thi các chứng chỉ này nhìn chung khá đắt. Có một số phiếu giảm giá được cung cấp thông qua sales, event. Một cách khác để kiếm những phiếu giảm giá này là tham gia Kubecon/CloudNativeCon để lấy event discount. Khi thi sẽ có giám thị quan sát qua camera và kiểm tra màn hình của người thi. Các thông tin về bài thi được cập nhật trên repo cncf/curriculum

Section 2: Cloud Native Architecture Fundamentals

Cloud Native Architecture Fundamentals

  • Thách thức với các monolithic applications là việc thay đổi một tính năng có thể ảnh hưởng tới toàn bộ ứng dụng. Việc thay đổi một thư viện (hoặc phiên bản của chúng) nhằm đáp ứng tính năng này nhưng có thể ảnh hưởng tới tính năng khác không liên quan.

  • Trong ngữ cảnh các monolithic applications, tight coupling chỉ các ứng dụng có User Interface và Bussiness Logic rất khó để làm việc độc lập.

  • Microservices Architecture mang đến sự tiện lợi và làm ứng dụng dễ quản lý hơn. Nó cho phép ứng dụng "co giãn" trong khi chúng đang chạy. Điều này không thể thực hiện trong monolithic vì chúng bắt buộc phải downtime

  • Một ứng dụng Cloud Native nghĩa là chúng cần đáp ứng các tiêu chí:

    • Resiliency
    • Agility
    • Operabitily
    • Observability
  • Một ứng dụng có tính Microservices nghĩa là

    • Có ít sự kết hợp giữa các thành phần
    • Độc lập tương đối giữa các components
    • Mỗi services chỉ tập trung thực hiện một trách nhiệm
    • Đảm bảo các tính chất của ứng dụng Cloud Native
  • DevOps là việc kết hợp hai quá trình phát triển ứng dụng (Dev) và vận hành sản phẩm (IT Operation) để nâng cao hiệu quả, tin cậy và rút ngắn thời gian phần mềm được luân chuyển giữa các quá trình. DevOps nhấn mạnh vào quá trình tự động hóa, giám sát và kết hợp giữa hai nhóm Dev và Ops.

  • Continuous Delivery (CD) là quá trình các thay đổi của code được tự động build, test và chuẩn bị cho việc release tới production. CD đẩy nhanh quá trình release, nâng cao năng suất và giảm thiểu rủi ro, độ phức tạp và downtime của hệ thống.

Cloud Native Practices

Mục đích của tự động hóa trong ứng dụng Cloud Native là gì?

Cung cấp tốc độ và sự nhanh chóng thông qua quá trình cập nhật mà với nó, triển khai hạ tầng và ứng dụng được thường xuyên liên tục.

Công cụ nào tập trung chính vào IAC (Infrastructure as Code)?

Terraform

Ansible đóng vai trò gì trong tự động hóa các ứng dụng Cloud Native?

Ansible is a toolset that could assist with many areas including Container and Application Lifecycles as well as infrastructure deployment

Tại sao nói Least Privilege đóng góp quan trọng trong bảo mật ứng dụng Cloud Native

Nó chỉ cấp quyền tối thiểu cần có cho từng thành phần hoặc user, đảm bảo giới hạn về khả năng bị tấn công và khai thác bởi bất kỳ vi phạm nào về an toàn thông tin.

  • Continuous Integration là phương pháp khuyến khích lập trình viên kiểm tra code một cách thường xuyên và tự động test project trước khi nó được release.

  • Continuous Delivery là phương pháp khuyến khích quá trình thay đổi code trong project thường xuyên hơn nhấn mạnh vào việc tự động testing và tạo ra một bản build có thể release.

  • Continuous Deployment là phương pháp khi các thay đổi trong dự án được tiếp tục triển khai và phát hành trên môi trường Production, thông thường không cần thao tác từ con người.

  • Zero Trust đề cập tới môi trường mà ứng dụng không tin tưởng bất kỳ thành phần nào và luôn kiểm tra lại định danh và xác thực của chúng.

Các hình thức Autoscaling?
  • Predictive Autoscaling
  • Reactive Autoscaling
  • Scheduled Autoscaling
  • Vertical Autoscaling

Cloud Native Personas, Role & Responsibility

DevOps Engineer

Các skill cần có bao gồm:

  • Infrastructure Provisioning
  • System Administration
  • Storage
  • Networking
  • Internet Services
  • Automation/Scripting
  • Continuous Integration / Continuous Delivery
  • Source Version Control (Git)
  • GitOps
  • Configuration Management
  • Performance Analytics and Monitoring

Mục tiêu chính của Kỹ sư DevOps là thu hẹp khoảng cách giữa phát triển và vận hành bằng cách đảm bảo rằng các bản phát hành phần mềm diễn ra suôn sẻ, hiệu quả và đáp ứng các yêu cầu của tổ chức. Họ làm việc chặt chẽ với cả nhóm phát triển và nhóm vận hành để xác định các điểm nghẽn, tối ưu hóa quy trình và triển khai các công cụ tự động hóa để cải thiện hiệu quả chung.

Site Reliability Engineering

Site reliability engineering tập trung nhiều hơn vào tính ổn định, tin cậy của ứng dụng. Nó nhấn mạnh vào các chỉ số uptime, availability, scalability, resilience, robustness, and the ability. Các chỉ số mà một SRE cần đảm bảo bao gồm: SLAs, SLOs và SLI

CloudOps Engineer

Giống DevOps nhưng trên cloud

Security Engineer

A security engineer specializes, as the name suggests, in IT security, and will typically have a holistic view and expertise that covers many different areas of IT security, ranging from attack vectors and best practices within operating systems to network based security, external threat detection and reduction.

DevSecOps Engineer
Fullstack Developer
Cloud Architect
Data Engineer

Section 3: Containers with Docker

chroot là gì?

Là một process cho phép người sử dụng thay đổi root directory cho một running process và các process con của chúng

Tên gọi của Docker trước đây là gì?

DotCloud

Hai thành phần chính mà Docker kết hợp để tạo ra giải pháp container là gì?

Linux Namespaces và cgroups

Tại sao Docker (containers) lại được ưu tiên hơn so với máy ảo?

Chúng deploy nhanh hơn và tiêu thụ ít tài nguyên hệ thống hơn

Có bao nhiêu namespaces trong Linux Kernel được giới thiệu năm 2002?

6

Network namespaces được sử dụng cho mục đích gì?

Cung cấp một networking stack độc lập với IP address và connectivity

Mount namespaces được sử dụng cho mục đích gì?

Cho phép các process sử dụng một cách độc lập các mount points.

Linux Kernel

Linux Kernel được giới thiệu năm 2002, là nền tảng cho container hiện tại. Nó bao gồm 6 namespace chính

  • user cô lập các user ID và cho phép các process trong space sử dụng ID đó trong các thành phần khác của hệ thống

  • pid cung cấp cho process một ID trên toàn bộ namespace và hệ thống và đảm bảo chúng không bị trùng

  • network cung cấp cho các process trong một namespace có networking stack độc lập của chúng, cho phép giao tiếp với các process trong cùng namespace

  • mount một hệ thống phân cấp filesystem độc lập cho phép process có view riêng vào filesystem, giúp chúng có thể mount hoặc unmount trong cùng một namespace mà không bị conflict.

  • uts unix time sharing, cho phép một namespace có hostname và domain name độc lập, dùng để định danh chúng.

  • ipc inter process communication, cho phép những thứ như Posix message đến process message queues.

Cgroups Kernel

Cgroups được Google phát triển từ năm 2006, phát hành vào năm 2007 và sau đó, merge vào Linux Kernel năm 2008

  • Resource limit: tài nguyên (CPU, MEM, NET, DISK) có thể sử dụng, còn lại của hệ thống là bao nhiêu

  • Prioritisation: tương tự như với resource limit và độ ưu tiên của process

  • Accounting: Giám sát và báo cáo giới hạn tài nguyên

  • Control: Khả năng điều chỉnh, kiểm soát trạng thái của một process trong cgroup như started/stopped/frozen/restarted.

Docker
What does Docker Desktop use to run an isolated instance for Docker?

A hidden virtual machine or "subsystem"

What is the main advantage of using Docker Desktop compared to traditional Docker?

It is more flexible and easier to reset

What is the purpose of the "i" flag when running the 'docker run' command?

To make the container interactive

What is the purpose of the "t" flag when running the 'docker run' command?

To create a terminal input/output environment for interacting with the container.

What is the purpose of the 'docker run' command followed by an image name (e.g., 'ubuntu')?

To start a new container using specified image

What is the function of Docker Extensions in Docker Desktop?

To allow developers to bundle DOcker-based apps for easy installation and running

What is one key difference between managing resources in Docker Desktop on a Mac compared to Windows?

On a Mac, you can customise shared resources in the Preferences, while on Windows, you cannot.

Được phát triển kể từ năm 2010 với mục đích ban đầu là cung cấp khả năng chạy một ứng dụng cloud (dotCloud). Vào 2013, dotCloud đổi tên thành Docker và trở thành open-sourced

Container Runtime sẽ tạo một Shared Linux Kernel với Containers. Sử dụng Linux Kernel để tạo môi trường cô lập với đầy đủ namespace của Kernel

Container
Container Overview
What is a container image?

A container image is a portable, self-contained bundle of software and its dependencies that can be executed consistently across different environments.

What is the difference between a container and a container image?

A container is indeed a running instance of the software, whereas a container image is a bundle of software that includes everything needed to run an application. Containers are created by instantiating an image, and they can be started, stopped, and deleted as needed.

What is a container registry?

A container registry is indeed a service that hosts and distributes container images. Registries provide a centralized location where images can be stored, shared, and accessed by multiple users or systems.

What is a tag in the context of container images?

In the context of container images, a tag is a label used to distinguish a specific version or variant of an image. Tags provide a way to identify and reference different versions of an image, making it easier to manage and track changes over time.

What is the purpose of the "latest" tag in Docker?

The "latest" tag in Docker serves as a default tag when working with images if a specific tag is not specified. When you pull or use an image without specifying a particular tag, Docker will automatically use the image with the "latest" tag

What is a union filesystem in the context of container images?

In the context of container images, a union filesystem (also known as a union mount or aufs) refers to a special type of filesystem that combines multiple individual layers into a single, unified view. This allows the contents of different layers to be accessed and used together seamlessly, even though they may originate from separate sources.

What is a digest in the context of container images?

In the context of container images, a digest refers to a secure and unique identifier that represents an image in a container registry. Digests are typically calculated using cryptographic hash functions (such as SHA-256), which produce a fixed-length string that uniquely identifies the contents of the image.

What is the difference between a digest and an image ID?

A digest is a checksum taken from a container registry, which represents the contents of an image as it exists in the registry. Digests are typically used to verify the integrity of images when they are pulled or pushed between registries. An image ID, on the other hand, is a checksum based on the local container image, which represents the actual bytes stored on disk. Image IDs are typically used by Docker and other container runtimes to identify and manage images locally.

What is the command used to validate the Docker version and configuration?

The command "docker version" provides detailed information about the Docker client and server versions, along with their configuration details. This makes it a more comprehensive option for validating both the version and configuration of Docker.

What is the container engine being used by Docker?

containerd is an industry-standard container runtime that is designed to manage the complete lifecycle of containers on a node. It's built by Docker and is the default container engine used by Docker since version 17.06.

Container Images
What is the purpose of the --rm option when running a Docker container?

The --rm option tells Docker to automatically remove the container when it exits or is stopped. This can be useful for containers that are only needed temporarily and should not persist after they finish running.

What command, in the original Docker command syntax, would display all containers, irrespective of their state, including those that have exited?

The command docker ps -a will list all containers, regardless of their state.

How can you override the default command in a Docker container when running it?

When you add a command to the end of the docker run command, it overrides the default command specified in the Dockerfile. This allows you to customize the behavior of the container without modifying the original image

What does the it option do when running a Docker container?

The -it option (short for "interactive" and "tty") allows you to run a Docker container in interactive mode, which means that you can interact with the container as if it were a local shell session. When used together, these options allocate a pseudo-TTY to the container, allowing you to see the output of commands in real-time.

Which command is used to remove a Docker container?

docker rm is indeed the command used to remove one or more Docker containers.

Which command line option is used to list all the parameters available to the Docker command?

In Docker, running docker --help will display a list of available commands and options, along with their descriptions.

What is the purpose of running a container as a non-root user?

To improve security by limiting privileges

What does the command "docker run --rm nginx" do?

Pulls the nginx image if it does not exist, runs a container and removes the container upon exit.

What is the purpose of the "-d" option in the command "docker run -d --rm -P nginx"?

The "-d" option in the command "docker run -d --rm -P nginx" detaches the container from the terminal, allowing it to run in the background.

What is the purpose of using the "-p" option in the command "docker run -d --rm -p 12345:80 nginx"?

The "-p" option in the command "docker run -d --rm -p 12345:80 nginx" specifies the port to be used for connectivity to the container. In this case, it maps port 80 inside the container to port 12345 on the host machine

What is the purpose of using a volume in Docker?

The purpose of using a volume in Docker is to store and manage data in a container

What is the better approach for managing files used by a container instead of modifying them directly within the container?

Using a volume that contains the data and passing it to the container provides a clean way to manage files outside of the container's filesystem

How do you publish all exposed ports of a container when running it with Docker?

The -P flag tells Docker to publish all exposed ports of the container to the host machine

Which command is used to execute another process inside a running Docker container?

docker exec allows you to run a command or execute another process inside a running Docker container

What is the primary purpose of the LABEL instruction in a Dockerfile?

The LABEL instruction in a Dockerfile is used to provide metadata about the container image, such as version numbers, authors, or other relevant information. Use it with LABEL key=value

Which LABEL is used to mention the author of the container?

The label org.opencontainers.image.authors is explicitly defined in the Open Container Initiative (OCI) specification as a way to provide information about the authors of the container image. Read more at: https://github.com/opencontainers/image-spec/blob/main/annotations.md

What does the WORKDIR instruction do in a Dockerfile?

The WORKDIR instruction sets the working directory for subsequent instructions in the Dockerfile.

What is a drawback of having too many layers in a container image?

Having too many layers in a container image can lead to potential inefficiencies in image size and build times. Each layer adds overhead to the image, increasing its overall size. Moreover, with an excessive number of layers, Docker's layer caching mechanism may not work efficiently during builds, resulting in slower build times.

What is the difference between the CMD and RUN instructions in a Dockerfile?

The CMD instruction specifies the default command that will be executed when the container starts running, whereas the RUN instruction executes commands during the Docker image build process.

What is the purpose of a multistage build in a Dockerfile?

The primary purpose of a multistage build in a Dockerfile is to reduce the size of the final container image.

In a multistage Dockerfile, how can you copy a binary from one stage to another?

In a multistage Dockerfile, you can copy a binary from one stage to another by using the COPY directive with the --from flag. The --from flag specifies the stage from which to copy the file.

What is the function of the Logical AND operator (&&) in a Dockerfile?

In a Dockerfile, the Logical AND operator (&&) is used to chain multiple commands together, so that they are executed only if the previous command completes successfully (i.e., exits with a zero status code). If any of the preceding commands fail, the subsequent commands will not be executed.

What was the purpose of the adduser command in our Dockerfile?

The adduser command in our Dockerfile was used to create a new user with reduced privileges.

What does the ENTRYPOINT in a Dockerfile do?

The ENTRYPOINT instruction in a Dockerfile specifies the command that should be executed when the container is started.

What is the primary advantage of using Docker Buildx for building and pushing container images compared to Docker Build?

Docker Buildx provides a significant advantage over traditional Docker Build when it comes to building and managing container images that need to run on multiple architectures (e.g., ARM, x86, etc.). With Buildx, you can build your image for multiple target platforms simultaneously, which simplifies the process of creating and maintaining multiarch images.

What does the docker system prune command do?

Removes stopped containers, unused networks, dangling images, and dangling build cache

Section 4: Kubernetes Fundamentals

Container Orchestration

What is the primary function of Container Orchestration?

Container Orchestration is primarily concerned with supporting the operational needs in running containers. This includes tasks such as:

  • Scaling containerized applications up or down
  • Managing resource allocation (e.g., CPU, memory)
  • Handling rolling updates and deployments
  • Monitoring application health and performance
  • Providing high availability and fault tolerance. Orchestration tools help ensure that containers are running smoothly, efficiently, and in a way that aligns with the needs of the application.
Which of the following is not a feature of Container Orchestration?

Database management is not typically considered a core feature of Container Orchestration

Which of these is a means of expanding Kubernetes to have functionality outside of core functionality?

CRDs (Custom Resource Definitions) are a means of expanding Kubernetes to have functionality outside of its core features. CRDs allow developers to define new resources and APIs that can be used to extend the Kubernetes platform

Which tool is considered the gold standard for Container Orchestration?

Kubernetes is widely regarded as the gold standard for Container Orchestration due to its robust feature set, large community support, and widespread adoption across industries and organizations

Which of the following is not a key area where Container Orchestration excels?

While container orchestration tools can provide some security features, Cybersecurity Threat Detection is not a primary focus of container orchestration.

What is the primary benefit of Container Orchestration in the deployment of complex applications?

The primary benefit of Container Orchestration in the deployment of complex applications is that it standardizes the deployment process and integrates with various components like networking, storage, security, and autoscaling. This enables developers to focus on writing code, rather than worrying about the underlying infrastructure.

In the context of Container Orchestration, what is the purpose of 'self-healing'?

The purpose of self-healing in Container Orchestration is to automatically fix or replace containers when they fail

Kubernetes Architecture

Which component is responsible for spawning and running containers in a Kubernetes architecture?

The Low-Level Container Runtime (e.g. runc) is a component that's responsible for actually running the containers in a Kubernetes architecture

What is the role of the Kubelet in the Kubernetes architecture?

The Kubelet acts as the primary node agent that runs on each machine in a Kubernetes cluster. Its main responsibility is to maintain the state of Pods (collections of containers) on its host machine

How is ETCD used in the Kubernetes architecture?

ETCD (etcd.io) is a distributed key-value store that's used in Kubernetes to store and manage the state of the cluster. It acts as the single source of truth for all data, including Pod definitions, ReplicaSets, Deployments, Services, and more

What is the role of the Kube-Api Server in the Kubernetes architecture?

The Kube-Api Server acts as the central entry point for the Kubernetes cluster, providing a RESTful API interface to other components and external clients

What is the function of the Kube-Scheduler in the Kubernetes architecture?

The Kube-Scheduler, also known as the Scheduler, is responsible for determining which nodes in a Kubernetes cluster are valid placements for pods based on various constraints and resource requirements.

What role does the Kube-Proxy play in the Kubernetes infrastructure?

The Kube-Proxy, also known as the Proxy, is a network proxy that runs on each node in a Kubernetes cluster. Its primary function is to dynamically configure TCP/UDP and SCTP forwarding on the system it runs on, allowing pods to communicate with each other even if they are not running on the same host.

What is the role of the Controller-Manager in the Kubernetes architecture?

The Controller-Manager, also known as the controller-manager, is a component in the Kubernetes control plane that runs control loops to monitor the state of the cluster and make or request changes to achieve the desired state

Which component bridges functionality of the cloud provider to the Kubernetes server?

The Cloud Controller Manager (CCM) bridges functionality of the cloud provider to the Kubernetes server

What protocol is used by distributed systems to ensure that each node in the cluster agrees on the same state even in the face of failures?

RAFT (Reliable Asynchronous Fault-Tolerant) is a consensus protocol designed specifically for distributed systems to ensure that each node in the cluster agrees on the same state even in the face of failures

How do nodes in a highly available Kubernetes configuration connect to the API server?

In a highly available Kubernetes configuration, nodes typically connect to the API server through a load balancer

What is a Pod in the context of Kubernetes?

In the context of Kubernetes, a Pod is indeed the smallest and simplest unit that you create or deploy. A Pod represents one or more containers that share resources like storage, networking, and execution. Pods can contain multiple containers, but they are scheduled together as a single entity on a node in the cluster.

Which of the following correctly represents the hierarchy of Kubernetes components, from broadest to most specific?

Cluster -> Node -> Pod -> Container

When does the Kubernetes Kube-Scheduler determine the node placement for a pod?

After a pod has been created and registered in etcd, Kube-Scheduler looks at its queue of pending pods to be scheduled (which now includes this newly created pod)

If a Kubernetes cluster hosted on a public cloud provider fails to provision a requested load balancer service, which component might be responsible for this failure?

The Cloud-Controller-Manager is a Kubernetes component that integrates with public cloud providers (like AWS, GCP, Azure) to provision external resources such as load balancers

Which of the following is considered a component of a Kubernetes node?

Kube-Proxy (or kube-proxy) is a network proxy that runs on each node in a Kubernetes cluster

Which of the following is considered a component of the Kubernetes control-plane?

Cloud-Controller-Manager is a component of the control plane that integrates with public cloud providers to provision external resources such as load balancers, persistent volumes, and more.

Kubernetes Namespaces

What is a key benefit of using Kubernetes Namespaces?

One of the key benefits of using Kubernetes Namespaces is isolating resources and limiting the scope of user privileges. Namespaces allow administrators to create multiple virtual clusters within a physical cluster, each with its own set of resources (such as pods, services, and secrets).

How can you describe a namespace within a Kubernetes cluster?

A namespace in Kubernetes can be thought of as a virtual cluster within the larger Kubernetes cluster. It provides a way to logically separate and organize resources, such as pods, services, and secrets, into distinct environments. This enables administrators to isolate resources and limit the scope of user privileges, improving security and simplifying resource management.

Which command is used to view all resources within all namespaces in a Kubernetes cluster?

The command kubectl get all -A is used to view all resources within all namespaces in a Kubernetes cluster. The '-A' flag stands for '--all-namespaces', which tells kubectl to retrieve information from all namespaces, not just the current one.

What is the purpose of the 'kube-system' namespace in Kubernetes?

The 'kube-system' namespace in Kubernetes is specifically designed to hold objects created by the Kubernetes system, such as system pods, services, and deployments that manage the cluster's infrastructure. These objects are typically not user-facing and are instead used internally by the Kubernetes system to manage the cluster.

If you run a command without specifying a namespace in Kubernetes, which namespace will it run in?

When you run a command without specifying a namespace in Kubernetes, it will run in the default namespace by default

How can a new namespace be created in Kubernetes?

To create a new namespace in Kubernetes, you can use the kubectl command with the create subcommand followed by the namespace keyword and the name of your namespace. For example: kubectl create namespace mynamespace

How can a new namespace be created in Kubernetes?

To create a new namespace in Kubernetes, you can use the kubectl command with the create subcommand followed by the namespace keyword and the name of your namespace. For example: kubectl create namespace mynamespace

How can you run a pod in a specific namespace in Kubernetes?

To run a pod in a specific namespace in Kubernetes, you can use the kubectl command with the -n option (or --namespace) followed by the name of your namespace and then the "run" subcommand. For example: kubectl -n mynamespace run pod. This will create and run a new pod within the specified namespace.

How can you delete a pod named 'nginx' in a specific namespace called mynamespace in Kubernetes?

To delete a pod named 'nginx' in a specific namespace called mynamespace in Kubernetes, you can use the kubectl command with the -n option (or --namespace) followed by the name of your namespace and then the "delete" subcommand along with the type and name of the resource to be deleted. For example: kubectl -n mynamespace delete pod/nginx. This will delete the specified pod in the specified namespace.

What are the default namespaces provided with a standard Kubernetes installation?

The four default namespaces provided with a standard Kubernetes installation are default, kube-system, kube-public, kube-node-lease

If a resource is "Namespaced" in Kubernetes, what does this mean?

When a resource is Namespaced in Kubernetes, it means that it is tied to a particular Namespace and exists within the context of that Namespace. This allows for multiple resources with the same name to coexist in different namespaces, without conflicting with each other. For example, you can have a pod named "my-pod" in both the "dev" and "prod" namespaces.

What command will change the current context to use a specific namespace?

The command kubectl config set-context --current --namespace=mynamespace will change the current context to use a specific namespace, named "mynamespace". In Kubernetes, contexts determine which cluster and namespace you are interacting with when using the kubectl command-line tool.

What will happen to the resources inside a namespace if the namespace is deleted in Kubernetes?

When a namespace is deleted in Kubernetes, all the resources within that namespace are also deleted. This includes pods, services, deployments, and any other resource that was created within the namespace. This behavior ensures that deleting a namespace effectively cleans up all associated resources, preventing orphaned or abandoned objects from remaining in the cluster.

Kubernetes Deployments and ReplicaSets

Section 5: Kubernetes in Deep dive

Tạo một mô hình học máy dựa vào dữ liệu

Disclaimer

Đào tạo một mô hình học máy hiệu quả là công việc khó khăn. Bản thân mình mặc dù học tập khá là chăm chỉ, nhưng chưa thể tạo được một mô hình học máy hoàn chỉnh. Bài viết này không đề cập tới việc sử dụng các ứng dụng hỗ trợ training và model experiment tracking, do hầu hết chúng mặc dù có thể sử dụng miễn phí, cũng có một giới hạn nhất định. Việc sử dụng công cụ sẽ giúp tiết kiệm nhiều thời gian, nhưng theo mình sẽ giống như nghiện thuốc, dần dần phụ thuộc vào chúng. Bài viêt này được tạo ra với mục đích thuần túy là một báo cáo môn học, không phải một hướng dẫn hay trình tự cần có. Sử dụng nó với đúng nhu cầu, tìm kiếm và kết luận đâu là phương pháp tốt nhất cho chính dự án của bạn.

Cài đặt môi trường để chạy trên local.

Cài đặt python notebook

  • Cài đặt python theo hướng dẫn: https://www.python.org/downloads/
  • Cài đặt venv (nếu version chưa có)
  • Cài đặt jupyter notebook kernel
  • Tạo một venv tại thư mục dự án: setting venv
  • Cài đặt jupyter notebook
    pip3 install jupyter ipykernel
    python3 -m ipykernel install --user --name=ml-demo --display-name "ml-demo"
    
  • Tại giao diện notebook, phía trên bên phải, chọn kelnel vừa tạo.

Cài đặt Experiments Tracking tool MLflow

Để thuận tiện, ta sử dụng Docker

docker-compose.yml
services:
  mlflow-server:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "5000:5000"
    volumes:
      - mlflow-data:/mlflow


volumes:
  mlflow-data:
Dockerfile
1
2
3
4
5
6
7
8
9
FROM python:3.13
WORKDIR /mlflow
RUN pip3 install mlflow psutil pynvml
ENV BACKEND_URI sqlite:///mlflow.db
ENV MLFLOW_ENABLE_SYSTEM_METRICS_LOGGING true
ENV MLFLOW_DEPLOYMENT_SERVER_START_TIMEOUT 600
ENV MLFLOW_GATEWAY_SEARCH_ROUTES_PAGE_SIZE 10
EXPOSE 5000
CMD mlflow ui --backend-store-uri $BACKEND_URI --host 0.0.0.0 --port 5000

Khởi tạo container, sau đó truy cập vào địa chỉ web http://localhost:5000/ để vào giao diện web.

Dữ liệu sử dụng

Trong bài này, mình đã chuẩn bị một bộ dữ liệu mô phỏng. Download và sử dụng tại đây.

Huấn luyện mô hình

Xem đầy đủ file notebook tại đây

Xử lý dữ liệu

Đọc dữ liệu từ file csv và kiểm tra một số thông tin của dữ liệu

df = pd.read_csv('data/train_.csv')
df.info()
df.shape
df.isnull().sum()
df.head()

Kết quả cho thấy thông tin các cột, loại dữ liệu của từng cột, số giá trị null của các cột, cuối cùng là một phần dữ liệu.

  • Dữ liệu dạng time series: bài toán forecast
  • Dữ liệu dạng nhãn: bài toán phân loại.

Ta có thể dễ dàng nhận ra rằng cột cuối cùng của dữ liệu là Label. Vậy đối với dữ liệu này, bài toán ta cần giải thuộc trường hợp thứ hai.

Phương pháp xử lý dữ liệu thô sơ nhất, là ta xử lý các trường hợp null của các cột. Ở ví dụ này, mình chỉ đơn giản điền các trường null thành -1

data_n_null = df.fillna(-1, inplace=False)

Cuối cùng, ta chia dataset thành các tập train, test.

data_sample = data_n_null.sample(frac=0.3) # We just use 30% of dataset to check, which model compatible.
X = data_sample.drop(columns=['Label'])
y = data_sample['Label']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 42)

Đào tạo với mô hình cơ bản

Với bài toán phân loại, có rất nhiều mô hình có thể thực hiện tốt. Với hiểu biết hạn hẹp, ở đây mình chỉ giới thiệu một vài mô hình cơ bản

Ta tiến hành đào tạo và lấy thông số F1, lưu lại các feature có đóng góp quan trọng với mô hình.

model = DecisionTreeClassifier()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
f1 = f1_score(y_test, y_pred, average='weighted')
print(f"F1 score: {f1}")
feature_scores = pd.Series(model.feature_importances_, index=X_train.columns).sort_values(ascending=False)
plt.figure(figsize=(20, 20))
sns.barplot(x=feature_scores, y=feature_scores.index)
plt.xlabel('Feature Importance Score')
plt.ylabel('Features')
plt.title("Visualizing Important Features")
feature_importance_plot = "feature_importance.png"
plt.savefig(feature_importance_plot, bbox_inches='tight')

Tương tự với Random Forest

model = RandomForestClassifier()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
f1 = f1_score(y_test, y_pred, average='weighted')
print(f"F1 score: {f1}")
feature_scores = pd.Series(model.feature_importances_, index=X_train.columns).sort_values(ascending=False)
plt.figure(figsize=(20, 20))
sns.barplot(x=feature_scores, y=feature_scores.index)
plt.xlabel('Feature Importance Score')
plt.ylabel('Features')
plt.title("Visualizing Important Features")
feature_importance_plot = "feature_importance.png"
plt.savefig(feature_importance_plot, bbox_inches='tight')

Cuối cùng là XGBoost

model = XGBClassifier()
label_encoder = LabelEncoder()
y_train_num = label_encoder.fit_transform(y_train)
y_test_num = label_encoder.fit_transform(y_test)
model.fit(X_train, y_train_num)
y_pred = model.predict(X_test)
f1 = f1_score(y_test_num, y_pred, average='weighted')
print(f"F1 score: {f1}")
feature_important = model.get_booster().get_score(importance_type='weight')
keys = list(feature_important.keys())
values = list(feature_important.values())
data = pd.DataFrame(data=values, index=keys, columns=['score']).sort_values(by = 'score', ascending=True)
data.nlargest(40, columns="score").plot(kind='barh', figsize = (20,20))

Ta lần lượt có được thời gian training, thông số F1 cùng hình ảnh minh họa mức độ quan trọng của các cột (feature) trong dataset với mô hình. Hình dưới là kết quả của mô hình Decision Tree

feature-importance-decision-tree

Sử dụng MLflow để tracking các chỉ số của model

Sử dụng MLflow rất đơn giản. Nhiều model có hỗ trợ. Ta chỉ cần gọi một lệnh.

# Setting mlflow information
ML_TRACKING_URL = "http://localhost:5000"
mlflow.set_tracking_uri(ML_TRACKING_URL)
mlflow.set_experiment("decision_tree")
mlflow.sklearn.autolog()

# Star training model
model = DecisionTreeClassifier()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
f1 = f1_score(y_test, y_pred, average='weighted')
# Log f1 metric to model metrics
mlflow.log_metric("f1_score", f1)

feature_scores = pd.Series(model.feature_importances_, index=X_train.columns).sort_values(ascending=False)
plt.figure(figsize=(20, 20))
sns.barplot(x=feature_scores, y=feature_scores.index)
plt.xlabel('Feature Importance Score')
plt.ylabel('Features')
plt.title("Visualizing Important Features")
feature_importance_plot = "feature_importance.png"
plt.savefig(feature_importance_plot, bbox_inches='tight')

# Save figure to model artifact and remove it from local
mlflow.log_artifact(feature_importance_plot)
os.remove(feature_importance_plot)

Sau khi thực thi xong, các thông số được ghi vào MLflow. Thực thi nhiều lần sẽ được ghi nhiều lần. Ta có thể xem nhiều thông số bằng cách nhấn vào từng experiment.

mlflow-over=view

Sử dụng optuna để hyper parameter turning

Có nhiều thuật toán và thư viện để thực hiện nhiệm vụ này. Bản thân mình đã thử nghiệm GridSearchCV và RandomizedSearchCV của sklearn nhưng chúng quá nặng, chạy chậm. Vì vậy không phù hợp với điều kiện hiện tại.

Optunal sử dụng các studytrial để định nghĩa quá trình hyper param. Một study bao gồm nhiều trial.

def xgboost_objective(trial):
    with mlflow.start_run(nested=True) as run:
        params = {
            "tree_method" : "hist",
            "device" : "cuda",
            "objective": "reg:squarederror",
            "n_estimators": 1000,
            "verbosity": 0,
            "eval_metric" : ["rmse", "mae", "mape", "logloss","error","auc"],
            "learning_rate": trial.suggest_float("learning_rate", 1e-3, 0.1, log=True),
            "max_depth": trial.suggest_int("max_depth", 1, 10),
            "subsample": trial.suggest_float("subsample", 0.05, 1.0),
            "colsample_bytree": trial.suggest_float("colsample_bytree", 0.05, 1.0),
            "min_child_weight": trial.suggest_int("min_child_weight", 1, 20),
        }
        model = XGBClassifier(**params)
        mlflow.xgboost.autolog()
        model.fit(X_train, y_train, verbose=False)
        y_pred = model.predict(X_test)
        accuracy = accuracy_score(y_test, y_pred)
        f1 = f1_score(y_test, y_pred, average='weighted')
        precision = precision_score(y_test, y_pred, average='weighted')
        recall = recall_score(y_test, y_pred, average='weighted')
        mlflow.log_metric("accuracy", accuracy)
        mlflow.log_metric("f1_score", f1)
        mlflow.log_metric("precision", precision)
        mlflow.log_metric("recall", recall)

        # Log a file contain some information of model
        metrics_file = "model_summary.json"
        metrics = {
            "parameter" : {**params},
            "metrics" : {
                "f1" : f1,
                "precision" : precision,
                "accuracy" : accuracy,
                "recall" : recall
            }

        }

        with open(metrics_file, "w") as f:
            json.dump(metrics, f, indent=4)

        mlflow.log_artifact(metrics_file)
        os.remove(metrics_file)

        # Save run_id of run to trial
        trial.set_user_attr("run_id", run.info.run_id)
    return f1

# This function will callback after each trial. It will mark which value is best now
def champion_callback(study, frozen_trial):
    winner = study.user_attrs.get("winner", None)
    if study.best_value and winner != study.best_value:
        study.set_user_attr("winner", study.best_value)
        if winner:
            improvement_percent = (abs(winner - study.best_value) / study.best_value) * 100
            print(
                f"Trial {frozen_trial.number} achieved value: {frozen_trial.value} with "
                f"{improvement_percent: .4f}% improvement"
            )
        else:
            print(f"Initial trial {frozen_trial.number} achieved value: {frozen_trial.value}")

tags = {
    "dataset_frac": 1.0,
    "random_state": 42,
    "test_size" : 0.2,
    "droped_column" : ['ID','IPv','Drate','Telnet','SMTP','ARP','cwr_flag_number','ece_flag_number','fin_flag_number','SSH','psh_flag_number','rst_flag_number'], # Base on feature importance score, we will drop some column to decrease dimention.This help us downgrade size of model
    "author": "Son Nguyen"
}

data = data_n_null.drop(columns=tags['droped_column'])
data_sample = data.sample(frac=tags['dataset_frac'])
X = data_sample.drop(columns=['Label'])
y = data_sample['Label']
label_encoder = LabelEncoder()
y = label_encoder.fit_transform(y)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = tags['test_size'], random_state = tags['random_state'])

mlflow.set_experiment("xgboost")
optuna.logging.set_verbosity(optuna.logging.ERROR)
with mlflow.start_run(nested=True) as run:

    # mlflow.xgboost.autolog() can not put auto log here
    study = optuna.create_study(direction='maximize')
    study.optimize(xgboost_objective, n_trials=100, timeout=7200, callbacks=[champion_callback], show_progress_bar=True)

    best_trial = study.best_trial
    best_run_id = best_trial.user_attrs['run_id']
    # best_param = study.best_params
    best_value = study.best_value

    model_name = "XGBoost-Classifier"
    client = mlflow.tracking.MlflowClient()
    latest_ = client.get_latest_versions(model_name, stages=None)[0]

    model_uri = f"runs:/{best_run_id}/model"
    best_model = mlflow.register_model(model_uri, model_name)

    best_param = client.get_run(best_run_id).data.params

    # We will check the best trial in this study is higher than existing model. If yes, we will register this trial as new version of Model. Otherwise skip that
    if latest_:
        previous_f1_score = client.get_metric_history(latest_.run_id, "f1_score")[-1].value
        if previous_f1_score >= best_value:
            print(f"Last model is better. Current values {best_value}, latest values {previous_f1_score}")
        else:
            client.update_registered_model(
                name=model_name,
                description="Best moldel",
            )

            for key, value in best_param.items():
                client.set_model_version_tag(
                    name=model_name,
                    version=best_model.version,
                    key=key,
                    value=value
                )

            client.set_model_version_tag(
                name=model_name,
                version=best_model.version,
                key="values",
                value=best_value
            )

            for key, value in tags.items():
                mlflow.set_tag(key,value)
            mlflow.set_tag("job", "xgboost using optuna to search parameter")

Tổng quát, ta sử dụng optuna để suggest giá trị của các parameter trong một range do ta quy định. Nó chạy tối đa bao nhiêu lần trong tối đa bao nhiêu thời gian để tìm parameter tốt nhất, cho giá trị F1 cao nhất.

Sau khi chạy hoàn tất một study với rất nhiều trial, ta thu thập được nhiều thông số của các lần chạy. Ta tiến hành so sánh các mối tương quan của chúng để điều chỉnh khoảng tham số.

contribute-parallel

Hình trên cho thấy mức liên quan giữa các parameter tới việc chỉ số F1 của mô hình cao hay thấp. Từ đó quyết định mở rộng, thu hẹp, dịch chuyển khoảng tham số mà ta sẽ cung cấp cho optuna để dò tìm.

Info

Sẽ cố gắng cập nhật theo kiến thức mới của mình.

Fail2ban - Công cụ chống DDOS và brute force hiệu quả

Giới thiệu về Fail2ban

Fail2ban là một công cụ bảo mật mã nguồn mở giúp bảo vệ hệ thống khỏi các cuộc tấn công brute-force (thử mật khẩu liên tục). Công cụ này hoạt động bằng cách giám sát các tệp nhật ký (log files) để phát hiện các dấu hiệu của những cuộc tấn công không mong muốn. Khi phát hiện có một địa chỉ IP thực hiện các hành vi đáng ngờ, Fail2ban sẽ thực hiện các biện pháp phòng ngừa như chặn IP đó bằng tường lửa (firewall), qua đó giảm thiểu nguy cơ bị xâm nhập.

Cách thức hoạt động của Fail2ban

  • Giám sát tệp nhật ký: Fail2ban đọc và phân tích các tệp nhật ký từ các dịch vụ như SSH, Apache, và Postfix.

  • Xác định các IP xấu: Dựa vào các quy tắc (filters) đã được định nghĩa trước, Fail2ban xác định các địa chỉ IP có dấu hiệu xâm nhập như nhiều lần đăng nhập thất bại trong một khoảng thời gian ngắn.

  • Thực hiện lệnh chặn: Khi phát hiện IP đáng ngờ, Fail2ban sẽ thực hiện các hành động (jails) để chặn IP, thường là sử dụng iptables để chặn truy cập hoặc thực hiện các hành động tùy chỉnh khác.

  • Gỡ chặn sau thời gian quy định: Sau một khoảng thời gian cấu hình, Fail2ban sẽ tự động gỡ chặn các IP nếu không tiếp tục phát hiện hành vi đáng ngờ.

Một số tính năng chính của Fail2ban

  • Hỗ trợ đa dạng dịch vụ: Có thể thiết lập để bảo vệ nhiều dịch vụ trên hệ thống như SSH, HTTP(S), FTP, email.

  • Linh hoạt trong cấu hình: Cho phép người dùng định nghĩa các quy tắc chặn, thời gian chặn, và các hành động tuỳ chỉnh khi phát hiện IP đáng ngờ.

  • Khả năng mở rộng: Dễ dàng thêm các bộ lọc (filter) mới hoặc tùy chỉnh theo nhu cầu bảo mật.

  • Fail2ban là một giải pháp đơn giản nhưng rất hiệu quả trong việc bảo vệ hệ thống khỏi các cuộc tấn công brute-force, giúp giảm thiểu nguy cơ bị xâm nhập và gia tăng an ninh cho hệ thống của bạn.

Cấu hình Fail2ban theo best practice

Nhìn chung, cài Fail2ban trên linux được thực hiện dễ dàng, hỗ trợ một số hệ điều hành cơ bản. Người dùng cũng có thể cài đặt trên các hệ điều hành khác thông qua việc sử dụng python script1.

Mặc dù là một repo với số lượng star cũng như thời gian phát triển dài, nhưng tài liệu sử dụng cho phần mềm khá hạn chế, chỉ được host bằng Github Wiki. Vì vậy, trong quá trình sử dụng, mình sẽ dùng phần dưới đây để bổ sung và cập nhật các thiết đặt.

Best Practice

Cây thư mục cấu hình của Fail2ban

/etc/fail2ban
├── action.d
│   ├── abuseipdb.conf
│   ├── apf.conf
│   ├── apprise.conf
│   ├── blocklist_de.conf
│   ├── cloudflare-token.conf
│   ├── cloudflare.conf
|   ...
├── fail2ban.conf
├── fail2ban.d
├── filter.d
│   ├── 3proxy.conf
│   ├── apache-auth.conf
│   ├── apache-badbots.conf
│   ├── apache-botsearch.conf
│   ├── apache-common.conf
│   ├── apache-fakegooglebot.conf
│   ├── apache-modsecurity.conf
│   ├── apache-nohome.conf
│   ├── apache-noscript.conf
│   ├── apache-overflows.conf
│   ...
├── jail.conf
├── jail.d
│   └── 00-firewalld.conf
├── paths-common.conf
└── paths-fedora.conf

Tại best practice trên wiki các tác giả đã trình bày cơ bản về các phương pháp thực hiện cơ bản để Fail2ban hoạt động tốt và ít sử dụng tài nguyên. Tóm tắt có thể đề cập

  • Fail2ban sử dụng regex để phát hiện các truy cập bất thường trong các file nhật ký, từ đó có thông tin để cấm những truy cập này. Vì vậy cần optimize regex patterns trong các folder filter.daction.d.

  • Prefiltering and Regex Order: Nếu log có nhiều các thông tin khác, có thể sử dụng prefregex để filter bớt các thông tin này để giảm số message mà Fail2ban phải xử lý. Đồng thời sắp xếp các regex theo tần suất xuất hiện, các mẫu chung nên được viết ở trên.

  • Giảm thiểu ghi các log không liên quan, các log thông tin ứng dụng nên ghi ra file khác để Fail2ban không phân tích chúng. Đặt mức ghi log thấp và phân loại chi tiết log cho mỗi ứng dụng cũng làm tăng hiệu suất của Fail2ban (ví dụ như 403 và 404 riêng cho nginx)

  • Sử dụng tính năng increment bantime theo thời gian, tăng số thời gian cấm truy cập sau nhiều lần xác thực không thành công liên tục.

Mẫu cấu hình fail2ban

/etc/fail2ban/fail2ban.local
[DEFAULT]
loglevel = INFO
logtarget = /var/log/fail2ban.log
syslogsocket = auto
socket = /var/run/fail2ban/fail2ban.sock
pidfile = /var/run/fail2ban/fail2ban.pid
dbfile = /var/lib/fail2ban/fail2ban.sqlite3
dbpurgeage = 1d
dbmaxmatches = 10
/etc/fail2ban/jail.local
[INCLUDES]
before = paths-fedora.conf

[DEFAULT]

bantime.increment = true
bantime.rndtime = 300
bantime.maxtime = 1d
bantime.factor = 1
bantime.formula = ban.Time * (1<<(ban.Count if ban.Count<20 else 20)) * banFactor
bantime.overalljails = false
ignoreself = true
ignoreip = 127.0.0.1/8 ::1
ignorecommand = # if an ip match with ban rule, it will run this command (script), if script exit(0), fail2ban will not ban it, otherwise 1 is ban
bantime  = 30m
findtime  = 1m
maxretry = 5
maxmatches = %(maxretry)s
backend = auto
usedns = raw
logencoding = auto
mode = normal

filter = %(__name__)s[mode=%(mode)s]

# Destination email address used solely for the interpolations in
# jail.{conf,local,d/*} configuration files.
#destemail = root@localhost

# Sender email address used solely for some actions
#sender = root@<fq-hostname>

# E-mail action. Since 0.8.1 Fail2Ban uses sendmail MTA for the
# mailing. Change mta configuration parameter to mail if you want to
# revert to conventional 'mail'.
#mta = sendmail
protocol = tcp
chain = <known/chain>
port = 0:65535
fail2ban_agent = Fail2Ban/%(fail2ban_version)s
banaction = nftables
banaction_allports = nftables
action_ = %(banaction)s[port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
#action_xarf = %(action_)s
             #xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]
action = %(action_)s
/etc/fail2ban/action.d/nftables.conf
[Definition]
type = multiport
rule_match-allports = meta l4proto \{ <protocol> \}
rule_match-multiport = $proto dport \{ $(echo '<port>' | sed s/:/-/g) \}
match = <rule_match-<type>>
rule_stat = %(match)s <addr_family> saddr @<addr_set> <blocktype>
_nft_for_proto-multiport-iter = for proto in $(echo '<protocol>' | sed 's/,/ /g'); do
_nft_for_proto-multiport-done = done
_nft_list = <nftables> -a list chain <table_family> <table> <chain>
_nft_get_handle_id = grep -oP '@<addr_set>\s+.*\s+\Khandle\s+(\d+)$'
_nft_add_set = <nftables> add set <table_family> <table> <addr_set> \{ type <addr_type>\; \}
              <_nft_for_proto-<type>-iter>
              <nftables> add rule <table_family> <table> <chain> %(rule_stat)s
              <_nft_for_proto-<type>-done>
_nft_del_set = { %(_nft_list)s | %(_nft_get_handle_id)s; } | while read -r hdl; do
               <nftables> delete rule <table_family> <table> <chain> $hdl; done
              <nftables> delete set <table_family> <table> <addr_set>
_nft_shutdown_table = { <nftables> list table <table_family> <table> | grep -qP '^\s+set\s+'; } || {
                        <nftables> delete table <table_family> <table>
                      }
actionstart = <nftables> add table <table_family> <table>
              <nftables> -- add chain <table_family> <table> <chain> \{ type <chain_type> hook <chain_hook> priority <chain_priority> \; \}
              %(_nft_add_set)s
actionflush = { <nftables> flush set <table_family> <table> <addr_set> 2> /dev/null; } || {
              %(_nft_del_set)s
              %(_nft_add_set)s
              }
actionstop = %(_nft_del_set)s
             <_nft_shutdown_table>
actioncheck = <nftables> list chain <table_family> <table> <chain> | grep -q '@<addr_set>[ \t]'
actionban = <nftables> add element <table_family> <table> <addr_set> \{ <ip> \}
actionunban = <nftables> delete element <table_family> <table> <addr_set> \{ <ip> \}
[Init]
table = f2b-table
table_family = inet
chain = f2b-chain
chain_type = filter
chain_hook = input
chain_priority = -1
addr_type = ipv4_addr
name = default
port = http,https
protocol = tcp, udp
blocktype = drop
nftables = nft
addr_set = addr-set-<name>
addr_family = ip
/etc/fail2ban/jail.d/nginx-limit-req.conf
[nginx-limit-req]
enabled = true
port    = http,https
logpath = /var/log/nginx/error.log
/etc/fail2ban/filter.d/nginx-limit-req.conf
# This file use default of fail2ban, I do not change any thing

Danh sách cấu hình Fail2ban

Một số tài liệu hướng dẫn2 đã có đề cập về việc cấu hình Fail2ban, trọng tâm vào việc cấu hình chi tiết các dịch vụ trong jail.d. Ở đây nhắc lại và đề cập một số cấu hình mà mình thấy cần phải biết.

Cấu hình fail2ban.conf

loglevel = INFO

Cài đặt mức độ chi tiết của fail2ban log. Các giá trị bao gồm: CRITICAL, ERROR, WARNING, NOTICE, INFO

logtarget = /var/log/fail2ban.log

Định nghĩa log được ghi ra vào đâu, Các giá trị có thể là: STDOUT, STDERR, SYSLOG, SYSOUT, SYSTEMD-JOURNAL, FILE. Mặc định log được ghi vào /var/log/fail2ban.log.

syslogsocket = auto

Nếu cài đặt logtarget = SYSLOG, cài đặt trường này thành auto hoặc ghi nó ra file

socket = /var/run/fail2ban/fail2ban.sock

Nơi lưu socket file để giao tiếp daemon.

pidfile = /var/run/fail2ban/fail2ban.pid

Nơi lưu socket pid của process fail2ban

allowipv6 = auto

Có sử dụng fail2ban ở interface ipv6 hay không

dbfile = /var/lib/fail2ban/fail2ban.sqlite3

Địa chỉ lưu trữ dữ liệu của fail2ban. Fail2ban sử dụng sqlite làm database, hiện chưa hỗ trợ lưu vào các database truyền thống như mysql, postgres. Có thể sửa thành None để không lưu hoặc memory để chỉ lưu vào memory (sẽ bị mất dữ liệu khi restart process)

dbpurgeage = 1d

Thời gian mà danh sách bị cấm trong database được xóa đi. Mặc định là 1 ngày.

dbmaxmatches = 10

Số lượng khớp được lưu trong database với mỗi ticket.

stacksize = 0

Kích thước stack được sử dụng cho các subsequently created threads

Cấu hình jail.conf

bantime = 1h

Thời gian mặc định một source matches bị cấm.

enabled = true

Có cho phép fail2ban xử lý các kết nối ssh hay không

before = paths-distro.conf

Include một số cấu hình của hệ điều hành như backend log, mysql log, nginx log. File này request cấu hình trong 2 file before = paths-common.confafter = paths-overrides.local. Nghĩa là mặc định, một config sẽ được cấu hình trong paths-common.conf, hoặc paths-distro.conf và chúng sẽ bị ghi đè bởi paths-overrides.local nếu khác nhau.

bantime.increment = true

Thời gian cấm được tăng theo cấp số nhân không. Mặc định là banTime * 1, 2, 4, 8, 16, 32.

bantime.rndtime = 300

Thời gian tối đa mà hệ thống random ngẫu nhiên để cấm một nguồn. Điều này sẽ làm giảm tác dụng của các botnet tính chính xác thời gian cấm được xóa và tấn công lại.

I

Thời gian tối đa cấm mà nó không tăng nữa, kể cả tiếp tục bị tấn công.

bantime.factor = 1

Hệ số nhân của công thức tính thời gian cấm. Mặc định là 1, thời gian được tính theo công thức bantime.formula

bantime.formula = ban.Time * (1<<(ban.Count if ban.Count<20 else 20)) * banFactor

Công thức tính thời gian cấm của lần tiếp theo. Mặc định theo công thức trên, là lũy thừa hệ số 2.

bantime.multipliers = 1 5 30 60 300 720 1440 2880

Công thức tính thời gian cấm thay cho bantime.formula. Hệ số này nhân với bantime. Ví dụ, với bantime = 60, thời gian cấm sẽ được tính theo các lần matches: 1 min, 5 min, 30 min, 1 hour, 5 hour, 12 hour, 1 day, 2 day

bantime.overalljails = false

Nếu một IP được matches với 1 jail, fail2ban có sử dụng nó để kiểm tra trên toàn bộ các jail config khác không. Ví dụ, một IP bị cấm bởi nginx thì có được đưa vào xem xét trên ssh, mysql hay không. Mặc định là false

ignoreself = true

Bỏ qua địa chỉ local. Fail2ban cũng không cấm các host match với địa chỉ local này.

ignoreip = 127.0.0.1/8 ::1

Các dãy địa chỉ được bỏ qua, fail2ban sẽ không cấm các địa chỉ này.

ignorecommand = /path/to/command

Nếu fail2ban xác định một IP thuộc rule bị cấm. Nó sẽ chạy command /path/to/command, nếu script trả kết quả exit 0, fail2ban sẽ bỏ qua địa chỉ này. Ngược lại, quá trình cấm sẽ bắt đầu. Ví dụ:

#!/bin/bash
IP=$1
MY_DYNAMIC_IP=$(/usr/bin/curl -s http://my-website/dynamic-ip-list)
if [[ "$IP" =~ $MY_DYNAMIC_IP ]]; then
    exit 0  # Ignore this IP
else
    exit 1  # Ban this IP
fi

maxretry = 5

Số lần lỗi trước khi bị ban

findtime = 10m

Thời gian mà một host bị cấm nếu request maxretry trong thời gian findtime.

maxmatches = %(maxretry)s

Số lượng log matches lưu trong memory đối với mỗi IP. Mặc định bằng maxretry. Nghĩa là memory sẽ lưu tối đa 5 matches log cho mỗi IP.

backend = auto

Chỉ định backend nào sẽ được sử dụng để monitor log. Các lựa chọn có thể là pyinotify, gamin, polling, systemdauto.

usedns = warn

Chỉ định có sử dụng dns để cấm hay không. Khi một DNS match với rule, fail2ban sẽ thực hiện một thao tác lookup để tìm source IP của DNS đó.

  • yes: nếu một hostname được bắt gặp, một request DNS lookup được thực hiện.
  • warn: nếu một hostname được bắt gặp, một request DNS lookup được thực hiện, ghi xuống log là warning.
  • no: nếu một hostname được bắt gặp, nó sẽ không được sử dụng để cấm, nhưng vẫn log xuống dưới dạng info.
  • raw: Sử dụng địa chỉ IP trong raw log, không thực hiện DNS lookup.

logencoding = auto

Loại encode mà các file log sử dụng. Config thông số này sẽ giúp fail2ban đọc được log của các ứng dụng để process.

enabled = false

Có kích hoạt jail hay không. Mặc định jail sẽ không kích hoạt, người sử dụng sau khi cài đặt và cấu hình các chi tiết liên quan sẽ thay đổi thông số này để kích hoạt fail2ban.

mode = normal
filter = %(name)s[mode=%(mode)s]

Định nghĩa mode và filter. Người dùng có thể định nghĩa nhiều mode với từng ứng dụng khác nhau.

sender = root@fq-hostname
destemail = root@localhost
mta = sendmail

Địa chỉ mà fail2ban sử dụng để gửi cùng địa chỉ nhận email thông báo. MTA là engine mà fail2ban sử dụng để gửi email.

protocol = tcp

Protocal sử dụng

chain = known/chain

Chỉ định chain được sử dụng để thêm rule. Fail2ban sử dụng iptables hoặc nftables để chặn các truy cập tới server.

port = 0:65535

Danh sách port có thể cấm. Người sử dụng có thể chỉ định một range port có thể cấm, range còn lại sẽ nằm ngoài phạm vi.

fail2ban_agent = Fail2Ban/%(fail2ban_version)s

Format của user agent. Tham khảo thêm tại https://tools.ietf.org/html/rfc7231#section-5.5.3

banaction = iptables-multiport
banaction_allports = iptables-allports

Chỉ định cách thực hiện hành động cấm. Mặc định sẽ sử dụng iptables

action_ = %(banaction)s[port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]

Chỉ định hành động cấm. Chỉ cấm.

action_mw = %(action_)s
%(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]

Chỉ định hành động cấm. Cấm và gửi email thông báo cấm tới destemail

action_xarf = %(action_)s
xarf-login-attack[service=%(name)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]

Chỉ định hành động cấm. Cấm và gửi email thông báo cấm tới destemail kèm các dòng log liên quan.

action_cf_mwl = cloudflare[cfuser="%(cfemail)s", cftoken="%(cfapikey)s"]
%(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]

Chỉ định hành động cấm trên cloudflare và gửi email tới những người nhận và các dòng log liên quan.

action_blocklist_de = blocklist_de[email="%(sender)s", service="%(name)s", apikey="%(blocklist_de_apikey)s", agent="%(fail2ban_agent)s"]
action_abuseipdb = abuseipdb

Gửi danh sách block tới fail2ban để các lập trình viên của họ phân tích.

action = %(action_)s

Chọn default action của fail2ban. Giá trị này được overwrite bởi các giá trị action_ đã đề cập bên trên.

Cấu hình action.d

Các action của fail2ban quy định nó làm gì khi match 1 rule. Ở đây ta sẽ xét 2 tính năng quan trọng nhất là chặn và cảnh báo, thông qua nftables và mail. Các action khác không đề cập.

type = multiport

Xác định match type nào để thực hiện.

rule_match-custom =

Nếu config type là custom, sử dụng config này để cấu hình rule custom đó.

rule_match-allports = meta l4proto { <protocol> }

Nếu config type là custom, sử dụng config này để cấu hình rule custom đó.

rule_match-multiport = $proto dport { $(echo '<port>' | sed s/:/-/g) }

Nếu config type là multiport, sử dụng config này để cấu hình rule custom đó.

match = <rule_match-<type>>

Phân giải rule dựa trên type

rule_stat = %(match)s <addr_family> saddr @<addr_set> <blocktype>

Một rule hoàn chỉnh để fail2ban cung cấp cho nftables nhập vào các chain.

_nft_for_proto-multiport-iter = for proto in $(echo '<protocol>' | sed 's/,/ /g'); do

Chỉ định lệnh shell lặp lại cho các giao thức trong ngữ cảnh nftables. Nghĩa là nó sẽ loop theo các protocol đã được config.

#Example: 
protocol = tcp, udp

# Rule will final to this
for proto in tcp udp; do
  # Commands inside the loop will execute for:
  # proto = "tcp" in the first iteration
  # proto = "udp" in the second iteration
done

_nft_list = <nftables> -a list chain <table_family> <table> <chain>

Câu lệnh để list all rule trong một chain

_nft_get_handle_id = grep -oP '@<addr_set>\s+.*\s+\Khandle\s+(\d+)$'

Câu lệnh dùng để tìm và trích xuất handle từ chuỗi đầu vào.

_nft_add_set =

Thêm một tập địa chỉ vào nftables

_nft_del_set =

Xóa các rule và tập địa chỉ set trong nftables

_nft_shutdown_table =

Câu lệnh xóa table trong nftables khi shutdown fail2ban

actionstart =

Chỉ định chuỗi hành động khi start service

actionflush =

Chỉ định chuỗi hành động xóa các chỉ mục trong tập địa chỉ

actionstop =

Chỉ định chuỗi hành động dừng cấu hình Fail2ban

actioncheck =

Chỉ định chuỗi hành động kiểm tra các rule trong chain

actionban =

Chỉ định chuỗi hành động thêm một rule cấm vào nftables

actionunban =

Chỉ định chuỗi hành động xóa một rule (unban) trong chain

[Init]

Các cấu hình trong phần này quy định các thiết đặt để tạo table, chain, family của nftables.


  1. Fail2Ban. How to install fail2ban packages. 2023. URL: https://github.com/fail2ban/fail2ban/wiki/How-to-install-fail2ban-packages (visited on 2024-11-01). 

  2. Webdock. How to configure fail2ban for common services. 2023. URL: https://webdock.io/en/docs/how-guides/security-guides/how-configure-fail2ban-common-services (visited on 2024-11-01).