Làm việc với User Secrets trong ứng dụng ASP.NET Core Bảo mật


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ại
  • dotnet user-secrets list: hiển thị danh sách key
  • dotnet 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)