Làm việc với User Secrets trong ứng dụng ASP.NET Core
Bài viết này chúng ta sẽ có một bài học về bảo mật dữ liệu trong project Github. Họ đã viết một crawler để tìm mật khẩu, username và các thông tin bảo mật khác trong project trên Github. Và họ đã tìm thấy rất nhiều các dữ liệu nhạy cảm của project, ngay cả với các công ty lớn, vậy nên chúng ta cần cẩn trọng hơn về bảo mật.
Hầu hết các thông tin credential được lưu trữ trong file config. Chắc chắn bạn cần config các thông tin như chuỗi kết nối CSDL, cấu hình mail, ftp...Trong nhiều trường hợp các credential này được sử dụng cho việc phát triển và nhiều hơn khi publish lên production.
Các thông tin nhạy cảm không nên được push lên bất cứ source repository nào. Tốt hơn nữa là không nên push lên public source repository nào.
Nhưng giải pháp ở đây là gì? Làm sao để cho ứng dụng biết được các thông tin đó để có thể chạy được?
Trên Azure, bạn có thể cấu hình ứng dụng trực tiếp trên application settings của ứng dụng. Nó sẽ ghi đè các setting trên file config bất kể cả web.config hay appsettings.json.
Nhưng bạn không thể làm điều đó với máy local. Không có config nào tương tự. Vậy làm thế nào để lưu thông tin đăng nhập hay thông tin nhạy cảm?
Với .NET Core đã có một thứ tương tự như vậy. Đó là SecretManager, cung cấp bởi .NET Core SDK (Microsoft.Extensions.SecretManager.Tools) bạn có thể truy cạp vào thông qua dotnet CLI.
Công cụ này lưu trữ thông tin bảo mật của bạn trên máy local. Đây không phải một công cụ quản lý password như kiểu keypass. Nó không thực sự bảo mật cao nhưng trên máy dev của bạn thì nó cung cấp khả năng để không lưu secret key của bạn trên file config của project. Đó chính là điểm mấu chốt.
Phải chắc chắn bạn có một userSecretsId trong file project (với .NET Core 2.0). Với ID này thì SecretManager gán cho ứng dụng:
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
<UserSecretsId>aspnet-TeduCore.WebApp-335984DF-E2C0-4E8C-95DA-DAA5EC2A6341</UserSecretsId>
<TypeScriptToolsVersion>2.4</TypeScriptToolsVersion>
<BaseNuGetRuntimeIdentifier>win7-x64</BaseNuGetRuntimeIdentifier>
<RuntimeIdentifier>win7-x64</RuntimeIdentifier>
<DockerComposeProjectPath>..\docker-compose.dcproj</DockerComposeProjectPath>
</PropertyGroup>
Nếu bạn tạo một ứng dụng ASP.NET Core mới trong Visual Studio, SecretManager đã được thêm sẵn. Giờ bạn chỉ cần truy cập vào các thông tin nhạy cảm qua ứng dụng của bạn. Trong project Visual Studio bạn cũng nên sử dụng AddUserSecret():
public Startup(IHostingEnvironment hostingEnvironment)
{
var builder = new ConfigurationBuilder()
.SetBasePath(hostingEnvironment.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{hostingEnvironment.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
if (hostingEnvironment.IsDevelopment())
{
builder.AddUserSecrets<Startup>();
}
Configuration = builder.Build();
}
Sau khi thêm builder.AddUserSecrets(); hiển thị như trên.
Extension Method AddUserSecrets() sẽ tải các secret key vào trong ứng dụng qua ConfigurationBuilder. Nếu các key này đã được tồn tại trong appsettings.json, file appsetting.json sẽ bị ghi đè.
Nếu tất cả xong xuôi bạn có thể dụng tool để lưu trữ một secret key mới bằng cách mở cửa sổ Command Promt tại thư mục của Web App:
dotnet user-secrets set key value
Nếu bạn muốn tạo một section mới như trong appsettings.config bạn cần kết hợp sectio name và setting name bởi dấu hai chấm:
"AppSettings": {
"MySecretKey": "Hallo from AppSettings",
"MyTopSecretKey": "Hallo from AppSettings"
},
Để ghi đè cac key này bạn chỉ cần dùng SecretManager, bạn ẽ tạo một entry với câu lệnh như sau:
dotnet user-secrets set AppSettings:MySecretKey "Hello from UserSecretStore"
dotnet user-secrets set AppSettings:MyTopSecretKey "Hello from UserSecretStore"

Chú ý: để ghi đè key đã tồn tại với giá trị mới, chỉ cần gọi lệnh set lại với cùng key nhưng giá trị mới.
Cách này làm việc ok với tôi.
The SecretManager có thêm vài câu lệnh như sau:
dotnet user-secrets clear: xoá tất cả các key đã tồn tạidotnet user-secrets list: hiển thị danh sách keydotnet user-secrets remove <key>: xoá một key cụ thể
Chỉ cần gõ dotnet user-secrets --help để hiển thị các câu lệnh cần thiết.
Nếu bạn cần quản lý vào secret key trong ứng dụng, bạn có thể tạo một batch file để add key và chia sẻ với các môi trường khác nhau nhưng đừng đẩy lên code repository.
Trích nguồn từ: asp.net-hacker.rocks
Tags:
Bài viết liên quan
Tổng quan các loại thuật toán mã hoá dữ liệu
Bài viết rất hay giới thiệu về tổng quan các loại thuật toán mã hoá dữ liệu dành cho những bạn nào muốn tìm hiểu về thuật toán mã hoá.
Đọc thêm
Series bảo mật trong ASP.NET MVC - 5: Rỏ rỉ thông tin máy chủ
Các thông tin về phiên bản được sử dụng bởi một kẻ tấn công sẽ khai thác để tấn công vào hệ thống.
Đọc thêm
Series bảo mật trong ASP.NET MVC - 4: Upload các tệp tin có hại
Qua 3 bài trước chúng ta đã từng tìm hiểu về cách bảo vệ tất cả các trường nhập liệu. Nhưng chúng ta đã bỏ qua một trường chính là trường File Upload
Đọc thêm
Series bảo mật trong ASP.NET MVC - 3: Tấn công Cross-Site Scripting (XSS)
Tấn công Cross-site Scripting (XSS) là cách tấn công bằng việc đẩy các đoạn mã javascript vào hệ thống thông qua các trường nhập liệu
Đọc thêm
Series bảo mật trong ASP.NET MVC - 2: Cross-Site Request Forgery (CSRF)
Cách tấn công CSRF này gọi là giả mạo request khi chúng giả mạo một request không phải từ chính website mà hacker sẽ giả lập request để gửi các thông tin lên server mà không qua hệ thống website.
Đọc thêm
Series bảo mật trong ASP.NET MVC - 1: Cấu hình Custom Error Page
Trong loại tấn công này, tin tặc sẽ lấy dữ liệu từ form được gửi lên từ người dùng và thay đổi giá trị sau đó gửi dữ liệu đã được sửa lên server
Đọc thêm
7 thủ thuật giúp bảo mật ứng dụng ASP.NET developer cần biết
Là một nhà phát triển web chuyên nghiệp, bạn phải biết được các chiêu thức để giúp ứng dụng bảo mật hơn. Trong bài viết này mình sẽ liệt kê và giải thích 7 thủ thuật bảo mật ứng dụng web.
Đọc thêm