12/08/2018, 18:27

Android Network Security Configuration - part1

Việc viết một ứng dụng giao tiếp dữ liệu với server là rất phổ biến. Chính vì vậy khi xây dựng ứng dụng bạn cũng cần phải quan tâm đến vấn đề truyền - nhận dữ liệu, thông tin một cách chính xác và an toàn, nếu một ứng dụng mà chứa các dữ liệu thông tin rất là riêng tư cần bảo mật thì càng phải quan ...

Việc viết một ứng dụng giao tiếp dữ liệu với server là rất phổ biến. Chính vì vậy khi xây dựng ứng dụng bạn cũng cần phải quan tâm đến vấn đề truyền - nhận dữ liệu, thông tin một cách chính xác và an toàn, nếu một ứng dụng mà chứa các dữ liệu thông tin rất là riêng tư cần bảo mật thì càng phải quan tâm đến vấn đề này.

Basic Network Security Configuration

Trong bài viết này sẽ trình bày 1 cách cơ bản về Network Security Configuration và quan sát lỗi khi xảy ra vấn đề.

Bạn hãy tham khảo source code tại đây để có thể theo dõi dễ dàng hơn vì bài viết sẽ base trên source code này.

Network Security Configuration cho phép app có thể tùy chỉnh network security thông qua một file cấu hình được khai báo sẵn. Toàn bộ cấu hình config sẽ được khai báo trong 1 file XML. File config cho phép cấu hình như sau:

  • Cleartext traffic opt-out: Disable cleartext traffic.
  • Custom trust anchors: Chỉ định Certificate Authorities và sources mà app trusts.
  • Debug-only overrides: Safely debug secure connections không gây ảnh hưởng đến release builds.
  • Certificate pinning: Hạn chế secure connections với certificates cụ thể.

File config có thể chỉ định bởi domains, cho phép cài đặt network security áp dụng với tất cả URL hoặc domains được chỉ định.

Chú ý: Network Security Configuration được support từ Android 7.0 (API 24) trở lên.

Create a Network Security Configuration XML file

Tạo một file xml resource file với tên: network_security_config.xml.

Tại folder res chọn New > Android resource file.

Sau đó điền đầy đủ thông tin như dưới và click OK

Tiếp theo là update nội dung của file xml vừa khởi tạo.

res/xml/network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="false" >
    </base-config>
</network-security-config>

Config này áp dụng cho base configuration hoặc default security configuration của app và disables all clear text traffic.

Enable the Network Security Configuration

Sau khi đã tạo file config xml rồi thì tiếp theo ta tiếp tục thêm một option config app tại file AndroidManifest.xml đồng thời tham chiếu option này đến file network_security_config.xml.

Add android:networkSecurityConfig vào application element trong AndroidManifest:

AndroidManifest.xml

 <application
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        ....
        android:networkSecurityConfig="@xml/network_security_config">

Compile and run the app

Sau khi hoàn thành config ban đầu thì hãy thử build và run app.

Bạn sẽ thấy error do app đang cố load data thông qua cleartext connection

Đồng thời nhìn vào logcat ta cũng sẽ thấy:

java.io.IOException: Cleartext HTTP traffic to storage.googleapis.com not permitted

App không thể nào load được data bởi vì nó đang được config để load message từ kết nối HTTP không được mã hóa. Nhưng URL được config trong gradle.properties là URL trỏ đến một HTTP server không sử dụng TLS.

Hãy thử thay đổi sang một URL khác và load data thông qua kết nối bảo mật HTTPS.

gradle.properties

postsUrl="https://storage.googleapis.com/network-security-conf-codelab.appspot.com/v1/posts.json"

Sau đó hãy rebuild lại app và check kết quả.

Data đã hiện lên, bởi vì ta đã thay đổi sử dụng một kết nối HTTPS thay vì HTTP.

Common Problem: Server-side updates

Network Security Configuration có thể bảo vệ, chống lại các lỗ hổng khi app thực hiện request data thông qua các kết nối không an toàn.

Có một problem phổ biết và cơ bản đó là Network Security Configuration sẽ ảnh hưởng đến toàn bộ URL được load trong Android app.

Ví dụ: Khi app request data lên server, server thực hiện response lại cho app nhưng không phải data nào cũng được trả về là URL HTTPS, mà có những thành phần trả về là URL HTTP như ảnh chẳng hạn. Và vì Network Security Configuration được thực thi cho các kết nối HTTPS nên với các kết nối HTTP sẽ được bắn ra Exception và request này sẽ không được đáp ứng.

Update the app backend

Như nêu ở trên, ta sẽ mô phỏng trường hợp các ảnh server trả về sẽ dưới dạng là các URL HTTP.

Thực hiện thay đổi lại gradle.properties file

gradle.properties

postsUrl="https://storage.googleapis.com/network-security-conf-codelab.appspot.com/v2/posts.json"

Thực hiện rebuild lại app và run. Và ta có thể dễ dàng nhận thấy các ảnh sẽ bị lỗi và không load được như trước, chỉ còn phần text là vẫn được giữ nguyên.

Và logcat:

java.io.IOException: Cleartext HTTP traffic to storage.googleapis.com not permitted

Chú ý: Ở đây việc lấy data JSON về vẫn là thông qua HTTPS request, nhưng url image trả về là các URL HTTP, khi thực hiện load ảnh lên sẽ gặp lỗi, text thì không vì đã được trả qua request lấy data JSON.

Protecting data

Network Security Configuration đã thành công trong việc ngăn chặn các kết nối dữ liệu ngẫu nhiên. Thay vì cố gắng truy cập dữ liệu không an toàn thì app block luôn connection đó.

Hãy tưởng tượng một kịch bản như này: Khi một thay đổi nào đó từ phía backend và thay đổi này đã không được test đầy đủ trước khi triển khai. Apply Network Security Configuration vào Android app của bạn sẽ catch được các vấn đề đó, ngay cả sau khi release app.

Change the backend to fix the app

Và để fix được vấn đề trên, ta lại tiếp tục thay đổi gradle.properties file.

gradle.properties

postsUrl="https://storage.googleapis.com/network-security-conf-codelab.appspot.com/v3/posts.json"

Sau đó rebuild và run app thôi. An tâm là ảnh lại được hiển thị đẹp đẽ đầy đủ.

Trên đây là cơ bản về Network Security Configuration, sử dụng Network Security Configuration trong Android app để ngăn chặn, phòng ngừa các kết nối data không an toàn, nhưng vẫn đang dừng lại ở mức basic. Trong phần tiếp theo mình sẽ nói rõ hơn về Domain configuration và Debug overrides trong Network Security Configuration. Mong bài viết có thể giúp ích cho bạn.

0