beskar 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +177 -19
  3. data/README.md +142 -122
  4. data/app/channels/concerns/beskar/channels/session_security.rb +46 -0
  5. data/app/controllers/beskar/administrative_actions_controller.rb +16 -0
  6. data/app/controllers/beskar/application_controller.rb +69 -25
  7. data/app/controllers/beskar/banned_ips_controller.rb +116 -141
  8. data/app/controllers/beskar/dashboard_controller.rb +20 -28
  9. data/app/controllers/beskar/security_events_controller.rb +37 -55
  10. data/app/controllers/concerns/beskar/controllers/audit_export.rb +54 -0
  11. data/app/controllers/concerns/beskar/controllers/security_tracking.rb +76 -48
  12. data/app/controllers/concerns/beskar/controllers/session_security.rb +29 -0
  13. data/app/jobs/beskar/notification_job.rb +33 -0
  14. data/app/mailers/beskar/security_mailer.rb +59 -0
  15. data/app/models/beskar/administrative_action.rb +41 -0
  16. data/app/models/beskar/banned_ip.rb +91 -132
  17. data/app/models/beskar/security_event.rb +37 -4
  18. data/app/models/beskar/security_state.rb +58 -0
  19. data/app/services/beskar/banned_ip_manager.rb +16 -6
  20. data/app/views/beskar/administrative_actions/index.html.erb +33 -0
  21. data/app/views/beskar/administrative_actions/show.html.erb +21 -0
  22. data/app/views/beskar/banned_ips/edit.html.erb +25 -89
  23. data/app/views/beskar/banned_ips/index.html.erb +20 -62
  24. data/app/views/beskar/banned_ips/new.html.erb +18 -138
  25. data/app/views/beskar/banned_ips/review.html.erb +24 -0
  26. data/app/views/beskar/banned_ips/show.html.erb +18 -15
  27. data/app/views/beskar/dashboard/index.html.erb +6 -6
  28. data/app/views/beskar/security_events/index.html.erb +18 -16
  29. data/app/views/beskar/security_events/show.html.erb +10 -20
  30. data/app/views/beskar/shared/_export_form.html.erb +10 -0
  31. data/app/views/beskar/shared/_waf_analysis.html.erb +25 -0
  32. data/app/views/layouts/beskar/_behavior.html.erb +121 -0
  33. data/app/views/layouts/beskar/application.html.erb +9 -76
  34. data/config/routes.rb +10 -21
  35. data/db/migrate/20251016000001_create_beskar_security_events.rb +3 -3
  36. data/db/migrate/20260910000001_create_beskar_security_states.rb +14 -0
  37. data/db/migrate/20260911000001_create_beskar_administrative_actions.rb +22 -0
  38. data/db/migrate/20260911000002_expand_administrative_action_targets.rb +6 -0
  39. data/docs/README.md +73 -0
  40. data/docs/archive/project-documentation.md +659 -0
  41. data/docs/audits/project-review.md +437 -0
  42. data/docs/audits/repair-status.md +216 -0
  43. data/docs/guides/audit-and-waf.md +188 -0
  44. data/docs/guides/audit-lifecycle.md +172 -0
  45. data/docs/guides/authentication.md +213 -0
  46. data/docs/guides/configuration.md +182 -0
  47. data/docs/guides/dashboard-and-search.md +251 -0
  48. data/docs/guides/notifications-and-recovery.md +157 -0
  49. data/docs/guides/risk-scoring.md +116 -0
  50. data/docs/operations/monitor-only-mode.md +85 -0
  51. data/docs/operations/security-hardening.md +167 -0
  52. data/docs/operations/state-storage.md +144 -0
  53. data/docs/research/rust-performance-assessment.md +69 -0
  54. data/lib/beskar/configuration.rb +84 -13
  55. data/lib/beskar/configuration_validator.rb +188 -0
  56. data/lib/beskar/devise_authentication.rb +24 -0
  57. data/lib/beskar/engine.rb +21 -88
  58. data/lib/beskar/logger.rb +30 -35
  59. data/lib/beskar/middleware/request_analyzer.rb +49 -82
  60. data/lib/beskar/models/security_trackable_authenticable.rb +72 -93
  61. data/lib/beskar/models/security_trackable_devise.rb +32 -23
  62. data/lib/beskar/models/security_trackable_generic.rb +169 -212
  63. data/lib/beskar/risk_level.rb +22 -0
  64. data/lib/beskar/services/account_locker.rb +85 -76
  65. data/lib/beskar/services/administrative_audit.rb +36 -0
  66. data/lib/beskar/services/administrative_bans.rb +104 -0
  67. data/lib/beskar/services/audit_data.rb +72 -0
  68. data/lib/beskar/services/authentication.rb +31 -0
  69. data/lib/beskar/services/authentication_attempt.rb +148 -0
  70. data/lib/beskar/services/ban_expiry.rb +28 -0
  71. data/lib/beskar/services/device_detector.rb +32 -41
  72. data/lib/beskar/services/event_search.rb +58 -0
  73. data/lib/beskar/services/geolocation_service.rb +83 -114
  74. data/lib/beskar/services/ip_whitelist.rb +31 -40
  75. data/lib/beskar/services/location_assessment.rb +109 -0
  76. data/lib/beskar/services/native_account_lock.rb +82 -0
  77. data/lib/beskar/services/notifications.rb +46 -0
  78. data/lib/beskar/services/rate_limiter.rb +103 -125
  79. data/lib/beskar/services/request_context.rb +69 -0
  80. data/lib/beskar/services/risk_assessment.rb +58 -0
  81. data/lib/beskar/services/session_revocation.rb +62 -0
  82. data/lib/beskar/services/waf.rb +166 -280
  83. data/lib/beskar/services/waf_request.rb +70 -0
  84. data/lib/beskar/version.rb +1 -1
  85. data/lib/beskar/warden_authentication.rb +53 -0
  86. data/lib/beskar.rb +53 -4
  87. data/lib/generators/beskar/install/install_generator.rb +36 -36
  88. data/lib/generators/beskar/install/templates/initializer.rb.tt +105 -20
  89. data/lib/tasks/beskar_tasks.rake +15 -19
  90. metadata +61 -8
@@ -0,0 +1,14 @@
1
+ class CreateBeskarSecurityStates < ActiveRecord::Migration[8.0]
2
+ def change
3
+ create_table :beskar_security_states do |t|
4
+ t.string :key, null: false
5
+ t.json :data, null: false, default: -> { "('{}')" }
6
+ t.datetime :expires_at
7
+ t.integer :lock_version, null: false, default: 0
8
+ t.timestamps
9
+ end
10
+ add_index :beskar_security_states, :key, unique: true
11
+ add_index :beskar_security_states, :expires_at
12
+ add_index :beskar_security_events, [:user_type, :user_id, :event_type, :created_at], name: "index_beskar_events_on_user_event_time"
13
+ end
14
+ end
@@ -0,0 +1,22 @@
1
+ class CreateBeskarAdministrativeActions < ActiveRecord::Migration[8.0]
2
+ def change
3
+ create_table :beskar_administrative_actions do |t|
4
+ t.string :actor, null: false, limit: 200
5
+ t.string :action, null: false
6
+ t.bigint :target_id, null: false
7
+ t.string :operation_id, null: false, limit: 36
8
+ t.string :request_id, null: false, limit: 200
9
+ t.text :reason, null: false
10
+ # MySQL requires JSON defaults to be expressions, even for literals.
11
+ t.json :before_state, null: false, default: -> { "('{}')" }
12
+ t.json :after_state, null: false, default: -> { "('{}')" }
13
+ t.datetime :created_at, null: false
14
+ end
15
+ # No user/ban foreign key or cascading association: the action must survive
16
+ # deletion of its live target. Retention is a separate, explicit operation.
17
+ add_index :beskar_administrative_actions, [:operation_id, :target_id], unique: true,
18
+ name: "index_beskar_actions_on_operation_target"
19
+ add_index :beskar_administrative_actions, [:target_id, :id]
20
+ add_index :beskar_administrative_actions, :created_at
21
+ end
22
+ end
@@ -0,0 +1,6 @@
1
+ class ExpandAdministrativeActionTargets < ActiveRecord::Migration[8.0]
2
+ def change
3
+ add_column :beskar_administrative_actions, :target_type, :string, null: false, default: "BannedIp"
4
+ change_column_null :beskar_administrative_actions, :target_id, true
5
+ end
6
+ end
data/docs/README.md ADDED
@@ -0,0 +1,73 @@
1
+ # Beskar documentation
2
+
3
+ Start with the current guides and operational contracts below. The original
4
+ review and archived overview describe earlier code; they are not current setup
5
+ instructions. [Repair status](audits/repair-status.md) distinguishes verified
6
+ changes from open findings and production validation still required.
7
+
8
+ ## Start here
9
+
10
+ - **Installing or integrating:** follow the [project README](../README.md#installation),
11
+ then read [configuration](guides/configuration.md),
12
+ [authentication](guides/authentication.md), and [state storage](operations/state-storage.md).
13
+ - **Upgrading an existing installation:** use the
14
+ [security hardening and rollout checklist](operations/security-hardening.md#rollout).
15
+ - **Working on repairs:** consult [repair status](audits/repair-status.md) and the
16
+ [original findings](audits/project-review.md) before selecting work.
17
+
18
+ ## Guides
19
+
20
+ - [Configuration](guides/configuration.md) — validation, supported capabilities,
21
+ defaults, and audited runtime changes.
22
+ - [Authentication](guides/authentication.md) — Devise/Warden admission, native
23
+ session integration, account locks, and revocation boundaries.
24
+ - [Risk scoring](guides/risk-scoring.md) — factors, geographic evidence, and
25
+ heuristic limitations.
26
+ - [Audit data and WAF](guides/audit-and-waf.md) — filtering, exports, scanner
27
+ matching, requested-path evidence, and privacy boundaries.
28
+ - [Audit lifecycle](guides/audit-lifecycle.md) — unchanged event retention,
29
+ administrative permissions, actor/reason history, and migrations.
30
+ - [Dashboard and search](guides/dashboard-and-search.md) — reporting, search,
31
+ routes, forms, timezones, and browser/CSP behavior.
32
+ - [Notifications and recovery](guides/notifications-and-recovery.md) — opt-in
33
+ delivery jobs and host-owned recovery flows.
34
+
35
+ ## Operations
36
+
37
+ - [State storage](operations/state-storage.md) — database authority, cache
38
+ independence, concurrency, rate limits, cleanup, and rollout.
39
+ - [Monitor-only mode](operations/monitor-only-mode.md) — observation behavior and
40
+ the transition to enforcement.
41
+ - [Security hardening](operations/security-hardening.md) — authentication
42
+ coverage, deployment requirements, availability tradeoffs, and validation gates.
43
+
44
+ ## Audits and repair tracking
45
+
46
+ - [Repair status](audits/repair-status.md) — completed batches, test evidence,
47
+ unresolved findings, and next verification gates.
48
+ - [Original project review](audits/project-review.md) — the September 2026
49
+ diagnostic baseline and F01–F26 findings; preserved as historical evidence.
50
+
51
+ ## Research and historical reference
52
+
53
+ - [Rust performance assessment](research/rust-performance-assessment.md) — a
54
+ measured investigation and proposal, not an implemented feature or performance
55
+ guarantee.
56
+ - [Archived project overview](archive/project-documentation.md) — the
57
+ pre-remediation architecture and examples; do not use it as current guidance.
58
+ - [Changelog](../CHANGELOG.md) — historical release notes.
59
+
60
+ ## Maintaining these docs
61
+
62
+ Keep `README.md` and `CHANGELOG.md` at the repository root. Put current feature
63
+ guides in `guides/`, deployment/runtime contracts in `operations/`, findings and
64
+ progress in `audits/`, proposals in `research/`, and superseded references in
65
+ `archive/`. Use lowercase, hyphenated filenames and relative Markdown links.
66
+ Source paths mentioned in prose are relative to the repository root.
67
+
68
+ Add new documents to this index. The gem includes `docs/**/*.md`; link/index and
69
+ packaging regressions run with:
70
+
71
+ ```sh
72
+ mise exec -- env PARALLEL_WORKERS=1 bin/rails test test/documentation_test.rb
73
+ ```