
कुबेरनेट्स RBAC स्थैतिक विश्लेषण और विज़ुअलाइज़ेशन उपकरण
Kubernetes RBAC विश्लेषण को आसान बनाया गया
Krane एक सरल Kubernetes RBAC स्थैतिक विश्लेषण उपकरण है। यह K8s RBAC डिज़ाइन में संभावित सुरक्षा जोखिमों की पहचान करता है और उन्हें कम करने के सुझाव देता है। Krane डैशबोर्ड वर्तमान RBAC सुरक्षा स्थिति प्रस्तुत करता है और आपको इसकी परिभाषा के माध्यम से नेविगेट करने देता है।
आप अपने लक्ष्य Kubernetes क्लस्टर में Helm चार्ट के माध्यम से इंस्टॉल करके या Docker के साथ स्थानीय रूप से चलाकर Krane के साथ आरंभ कर सकते हैं।
यह मान लिया गया है कि आपकी मशीन पर Helm CLI इंस्टॉल है।```sh $ helm repo add appvia https://appvia.github.io/krane $ helm repo update $ helm install krane appvia/krane --namespace krane --create-namespace
हेल्म चार्ट इंस्टॉलेशन आउटपुट का अनुसरण करें कि कैसे केर्न डैशबोर्ड को पोर्ट-फॉरवर्ड करें।
### डॉकर के साथ चलाएँ
यह माना जाता है कि आपके स्थानीय मशीन पर [डॉकर](https://docs.docker.com/get-docker/) चल रहा है। यदि पहले से नहीं है, तो [डॉकर-कम्पोज़](https://docs.docker.com/compose/install/#install-compose) इंस्टॉल करें।
केर्न रेडिसग्राफ़ पर निर्भर करता है। `docker-compose` स्टैक वह सब कुछ परिभाषित करता है जो स्थानीय रूप से _केर्न_ सेवा बनाने और चलाने के लिए आवश्यक है। यह इसकी [रेडिसग्राफ़](https://oss.redislabs.com/redisgraph/) निर्भरता का भी ध्यान रखेगा।```
docker-compose up -d
Krane डॉकर इमेज स्थानीय मशीन पर पहले से मौजूद न होने पर स्वचालित रूप से पूर्व-निर्मित हो जाएगी।
ध्यान दें कि जब docker-compose को स्थानीय रूप से चलाया जाता है, तो Krane RBAC report और dashboard को स्वचालित रूप से प्रारंभ नहीं करेगा। इसके बजाय, कंटेनर डिफ़ॉल्ट रूप से 24 घंटे के लिए सोएगा - इस मान को docker-compose.override.yml में समायोजित किया जा सकता है। चल रहे Krane कंटेनर में प्रवेश करें (Exec) कमांड चलाने के लिए। स्थानीय docker-compose कुबे कॉन्फिग (~/.kube/config) को कंटेनर के अंदर माउंट करेगा, जिससे आप उन किसी भी Kubernetes क्लस्टर के विरुद्ध रिपोर्ट चला सकते हैं जिन तक आपकी पहले से पहुँच है।
चल रहे Krane कंटेनर में प्रवेश करें।```sh docker-compose exec krane bash
एक बार कंटेनर में आप `krane` कमांड का उपयोग शुरू कर सकते हैं। `krane -help` आज़माएँ।```sh
krane -h
चल रही सेवाओं और संबंधित पोर्ट की जांच करने के लिए:``` docker-compose ps
_Krane_ और इसकी निर्भरता सेवाओं को रोकने के लिए:```
docker-compose down
$ krane --help
NAME:
krane
DESCRIPTION:
Kubernetes RBAC static analysis & visualisation tool
COMMANDS:
dashboard Start K8s RBAC dashboard server
help Display global or [command] help documentation
report Run K8s RBAC report
GLOBAL OPTIONS:
-h, --help
Display help documentation
-v, --version
Display version information
-t, --trace
Display backtrace when an error occurs
AUTHOR:
Marcin Ciszak <[email protected]> - Appvia Ltd <appvia.io>
### RBAC रिपोर्ट उत्पन्न करें
#### स्थानीय `kubectl` संदर्भ के साथ
एक चल रहे क्लस्टर के विरुद्ध रिपोर्ट चलाने के लिए आपको एक _kubectl_ संदर्भ प्रदान करना होगा।```
krane report -k <context>
आप -c <cluster-name> फ़्लैग भी पास कर सकते हैं यदि आप एक से अधिक क्लस्टर के विरुद्ध टूल चलाने और प्रत्येक क्लस्टर नाम के लिए अलग-अलग RBAC ग्राफ़ को अनुक्रमित करने की योजना बनाते हैं।
स्थानीय RBAC yaml/json फ़ाइलों के विरुद्ध रिपोर्ट चलाने के लिए, एक निर्देशिका पथ प्रदान करें।``` krane report -d </path/to/rbac-directory>
नोट: _Krane_ निम्नलिखित फ़ाइलों (YAML या JSON प्रारूप में) को निर्दिष्ट निर्देशिका पथ में मौजूद होने की अपेक्षा करता है:
- psp
- roles
- clusterroles
- rolebindings
- clusterrolebindings
यदि Pod Security Policies का उपयोग नहीं हो रहा है, तो आप `psp` फ़ाइल को मैन्युअल रूप से निम्नलिखित सामग्री के साथ बनाकर उपरोक्त अपेक्षा को दरकिनार कर सकते हैं:```json
{
"items": []
}
नोट, PodSecurityPolicy को Kubernetes v1.21 में बहिष्कृत किया गया था, और v1.25 में Kubernetes से हटा दिया गया।
Kubernetes क्लस्टर में चल रहे कंटेनर से एक रिपोर्ट चलाने के लिए``` krane report --incluster
नोट: _Krane_ द्वारा उपयोग किए जाने वाले सेवा खाते को RBAC संसाधनों तक पहुंच की आवश्यकता होगी। विवरण के लिए [पूर्वापेक्षाएँ](https://github.com/appvia/krane/blob/HEAD/k8s/one-time/prerequisites.yaml) देखें।
#### CI/CD पाइपलाइन में
CI/CD पाइपलाइन में एक चरण के रूप में RBAC परिभाषा को मान्य करने के लिए```
krane report --ci -d </path/to/rbac-directory>
नोट: Krane स्थानीय रूप से संग्रहीत RBAC संसाधन फ़ाइलों के लिए एक निश्चित नामकरण परंपरा का पालन करने की अपेक्षा करता है। ऊपर अनुभाग देखें। krane कमांड चलाने के लिए यह अनुशंसित है कि CI निष्पादक quay.io/appvia/krane:latest डॉकर इमेज का संदर्भ ले।
CI मोड --ci फ़्लैग द्वारा सक्षम किया जाता है। Krane एक या अधिक खतरों का पता चलने पर शून्येतर स्थिति कोड और जोखिम नियमों के उल्लंघन के विवरण के साथ वापस आएगा।
RBAC पहलू ट्री, नेटवर्क ग्राफ़ और नवीनतम रिपोर्ट निष्कर्षों को देखने के लिए आपको पहले डैशबोर्ड सर्वर शुरू करना होगा।``` krane dashboard
क्लस्टर फ़्लैग `-c <cluster-name>` को पास किया जा सकता है यदि आप डैशबोर्ड को विशिष्ट क्लस्टर नाम के विरुद्ध चलाना चाहते हैं। डैशबोर्ड निर्दिष्ट क्लस्टर नाम से संबंधित डेटा की खोज करेगा जो फ़ाइल सिस्टम पर कैश किया गया है।
उपरोक्त कमांड डिफ़ॉल्ट पोर्ट `8000` पर स्थानीय वेब सर्वर शुरू करेगा, और डैशबोर्ड लिंक प्रदर्शित करेगा।
## Architecture
### RBAC Data indexed in a local Graph database
_Krane_ RedisGraph में RBAC संस्थाओं को अनुक्रमित करता है। यह हमें [RedisGraph](https://oss.redislabs.com/redisgraph/) द्वारा समर्थित [CypherQL](https://oss.redislabs.com/redisgraph/cypher_support/) के उपसमूह का उपयोग करके कुशलतापूर्वक और सरलता से निर्भरताओं के नेटवर्क को क्वेरी करने की अनुमति देता है।
#### Schema

#### Nodes
The following nodes are created in the Graph for the relevant RBAC objects:
* `Psp` - एक PSP नोड जिसमें पॉड सुरक्षा नीति से संबंधित गुण हैं। केवल K8s < 1.25 के साथ काम करते समय लागू।
* `Rule` - Rule नोड Kubernetes संसाधनों के आसपास पहुँच नियंत्रण नियम का प्रतिनिधित्व करता है।
* `Role` - Role नोड किसी दिए गए Role या ClusterRole का प्रतिनिधित्व करता है। `kind` गुण भूमिका के प्रकार को परिभाषित करता है।
* `Subject` - Subject क्लस्टर में सभी संभावित अभिनेताओं का प्रतिनिधित्व करता है (`kind`: User, Group और ServiceAccount)
* `Namespace` - Kubernetes Namespace नोड।
#### Edges
* `:SECURITY` - Rule और Psp नोड्स के बीच लिंक को परिभाषित करता है। केवल K8s < 1.25 के साथ काम करते समय लागू।
* `:GRANT` - उस Role से जुड़े Role और Rule के बीच लिंक को परिभाषित करता है।
* `:ASSIGN` - एक अभिनेता (Subject) और दिए गए Role/ClusterRole (Role नोड) के बीच लिंक को परिभाषित करता है।
* `:RELATION` - दो अलग-अलग अभिनेता (Subject) नोड्स के बीच लिंक को परिभाषित करता है।
* `:SCOPE` - Role और Namespace नोड्स के बीच लिंक को परिभाषित करता है।
* `:ACCESS` - Subject और Namespace नोड्स के बीच लिंक को परिभाषित करता है।
* `:AGGREGATE` - ClusterRoles के बीच लिंक को परिभाषित करता है (एक ClusterRole दूसरे को एकत्रित करता है) `A-(aggregates)->B`
* `:COMPOSITE` - ClusterRoles के बीच लिंक को परिभाषित करता है (एक ClusterRole दूसरे में एकत्रित किया जा सकता है) `A<-(is a composite of)-B`
All edges are bidirectional, which means graph can be queried in either direction. Only exceptions are `:AGGREGATE` and `:COMPOSITE` relations which are uni-directional, though concerned with the same edge nodes.
#### Querying the Graph
In order to query the graph directly you can exec into a running `redisgraph` container, start `redis-cli` and run your arbitrary queries. Follow official [instructions](https://oss.redislabs.com/redisgraph/) for examples of [commands](https://oss.redislabs.com/redisgraph/commands/).
You can also query the Graph from _Krane_ console. First exec into running _Krane_ container, then```ruby
# Start Krane console - this will open interactive ruby shell with Krane code preloaded
console
# Instantiate Graph client
graph = Krane::Clients::RedisGraph.client cluster: 'default'
# Run arbitrary CypherQL query against indexed RBAC Graph
res = graph.query(%Q(
MATCH (r:Rule {resource: "configmaps", verb: "update"})<-[:GRANT]-(ro:Role)<-[:ASSIGN]-(s:Subject)
RETURN s.kind as subject_kind, s.name as subject_name, ro.kind as role_kind, ro.name as role_name))
# Print the results
res.print_resultset
+----------------+--------------------------------+-----------+------------------------------------------------+ | subject_kind | subject_name | role_kind | role_name | +----------------+--------------------------------+-----------+------------------------------------------------+ | ServiceAccount | bootstrap-signer | Role | system:controller:bootstrap-signer | | User | system:kube-controller-manager | Role | system::leader-locking-kube-controller-manager | | ServiceAccount | kube-controller-manager | Role | system::leader-locking-kube-controller-manager | | User | system:kube-scheduler | Role | system::leader-locking-kube-scheduler | | ServiceAccount | kube-scheduler | Role | system::leader-locking-kube-scheduler | +----------------+--------------------------------+-----------+------------------------------------------------+
नोट: उपरोक्त उदाहरण क्वेरी उन सभी विषयों (Subjects) का चयन करेगी जिनके पास `update configmaps` तक पहुंच प्रदान करने वाली भूमिकाएँ/क्लस्टरभूमिकाएँ (Roles/ClusterRoles) निर्धारित हैं।
## कॉन्फ़िगरेशन
### RBAC जोखिम नियम
RBAC जोखिम नियम [Rules](https://github.com/appvia/krane/blob/HEAD/config/rules.yaml) फ़ाइल में परिभाषित हैं। प्रत्येक नियम की संरचना काफी हद तक स्व-व्याख्यात्मक है। अंतर्निर्मित सेट को [Cutom Rules](https://github.com/appvia/krane/blob/HEAD/config/custom-rules.yaml) फ़ाइल में अतिरिक्त कस्टम नियम जोड़कर विस्तारित/ओवरराइड किया जा सकता है।
#### जोखिम नियम मैक्रो (Risk Rule Macros)
मैक्रो सामान्य/साझा विशेषताओं के एक सेट के लिए 'कंटेनर' होते हैं, और एक या अधिक जोखिम नियमों द्वारा संदर्भित किए जाते हैं। यदि आप किसी दिए गए जोखिम नियम में मैक्रो का उपयोग करना चुनते हैं, तो आपको इसका नाम से संदर्भ देना होगा, जैसे `macro: <macro-name>`। ध्यान दें कि संदर्भित `macro` में परिभाषित विशेषताएँ नियम स्तर पर परिभाषित समान विशेषताओं पर प्राथमिकता लेंगी।
मैक्रो में निम्नलिखित में से कोई भी विशेषता हो सकती है:
- `query` - [RedisGraph क्वेरी](#querying-the-graph). `template` पर प्राथमिकता रखती है। `writer` परिभाषित होना आवश्यक है।
- `writer` - राइटर एक Ruby अभिव्यक्ति है जिसका उपयोग `query` परिणाम सेट को फ़ॉर्मेट करने के लिए किया जाता है। राइटर का `template` पर प्राथमिकता होती है।
- `template` - अंतर्निर्मित क्वेरी/राइटर टेम्पलेट नाम। यदि `query` और `writer` निर्दिष्ट नहीं हैं तो चयनित क्वेरी जनरेटर और संबंधित राइटर का उपयोग किया जाएगा।
#### जोखिम नियम विशेषताएँ
नियम में निम्नलिखित में से कोई भी विशेषता हो सकती है:
- `id` [आवश्यक] नियम आईडी एक अद्वितीय नियम पहचानकर्ता है।
- `group_title` [आवश्यक] इस जोखिम जांच के अंतर्गत आने वाले सभी आइटमों पर लागू होने वाला शीर्षक।
- `severity` [आवश्यक] गंभीरता, :danger, :warning, :info में से एक।
- `info` [आवश्यक] जांच के बारे में पाठ्य जानकारी और जोखिम को कम करने के सुझाव।
- `query` [सशर्त] [RedisGraph क्वेरी](#querying-the-graph)।
- `template` पर प्राथमिकता रखती है। `writer` परिभाषित होना आवश्यक है।
- `writer` [सशर्त] राइटर एक Ruby अभिव्यक्ति है जिसका उपयोग क्वेरी परिणाम सेट को फ़ॉर्मेट करने के लिए किया जाता है।
- राइटर का `template` पर प्राथमिकता होती है। `query` परिभाषित होना आवश्यक है।
- `template` [सशर्त] अंतर्निर्मित क्वेरी/राइटर टेम्पलेट नाम। यदि `query` और `writer` निर्दिष्ट नहीं हैं तो चयनित क्वेरी जनरेटर और संबंधित राइटर का उपयोग किया जाएगा।
- कुछ अंतर्निर्मित टेम्पलेट्स को सही क्वेरी बनाने के लिए व्यक्तिगत नियम स्तर पर `match_rules` विशेषता निर्दिष्ट करने की आवश्यकता होती है। वर्तमान में इसकी आवश्यकता वाले टेम्पलेट्स:
- **_risky-role_** - `match_rules` द्वारा निर्दिष्ट एक्सेस नियमों के आधार पर मल्टी-मैच ग्राफ क्वेरी बनाता है। उत्पन्न ग्राफ क्वेरी निम्नलिखित कॉलम लौटाती है:
- role_name
- role_kind
- namespace_name (यदि एकाधिक आइटम लौटाए जाते हैं तो एक _सरणी_ लौटाई जाती है)
- `match_rules` [सशर्त] आवश्यक जब `template` क्वेरी बनाने के लिए मैच नियमों पर निर्भर करता है।
- उदाहरण:
```yaml
match_rules:
- resources: ['cronjobs']
verbs: ['update']
```
विशेषताएँ और मान [Kubernetes RBAC भूमिका विनिर्देश](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#role-examples) का पालन करते हैं।
- `custom_params` [वैकल्पिक] कस्टम कुंजी-मूल्य जोड़ियों की सूची जिनका मूल्यांकन किया जाएगा और नियम `query` और `writer` प्रतिनिधित्व में प्रतिस्थापित किया जाएगा।
- उदाहरण:
```yaml
custom_params:
- attrA: valueA
- attrB: valueB
```
उपरोक्त कुंजियों के लिए टेम्पलेट प्लेसहोल्डर `{{attrA}}` और `{{attrB}}` को क्रमशः `valueA` और `valueB` से प्रतिस्थापित किया जाएगा।
- `threshold` [वैकल्पिक] संख्यात्मक मान। जब परिभाषित किया जाता है तो यह `writer` अभिव्यक्ति में टेम्पलेट प्लेसहोल्डर `{{threshold}}` के रूप में उपलब्ध हो जाएगा।
- `macro` [वैकल्पिक] नामित मैक्रो में परिभाषित सामान्य पैरामीटर का संदर्भ।
- `disabled` [वैकल्पिक] जब `true` पर सेट किया जाता है तो यह दिए गए नियम को अक्षम करेगा और इसे मूल्यांकन से बाहर करेगा।
डिफ़ॉल्ट रूप से सभी नियम सक्षम हैं।
#### जोखिम नियम उदाहरण
##### स्पष्ट क्वेरी और राइटर अभिव्यक्ति```yaml
- id: verbose-rule-example
group_title: Example rule
severity: :danger
info: Risk description and instructions on how to mitigate it goes here
query: |
MATCH
(s:Subject)-[:ACCESS]->(ns:Namespace)
WHERE
NOT s.name IN {{whitelist_subject_names}}
RETURN
s.kind as subject_kind,
s.name as subject_name,
COLLECT(ns.name) as namespace_names
ORDER BY
subject_kind,
subject_name,
namespace_names DESC
threshold: 2
writer: |
if result.namespace_names.count > {{threshold}}
"#{result.subject_kind} #{result.subject_name} can access namespaces: #{result.namespace_names.join(', ')}"
end
disabled: true
उपरोक्त उदाहरण स्पष्ट रूप से एक ग्राफ query को परिभाषित करता है जिसका उपयोग RBAC जोखिम का मूल्यांकन करने के लिए किया जाता है, और एक writer अभिव्यक्ति जिसका उपयोग क्वेरी परिणाम सेट को प्रारूपित करने के लिए किया जाता है। क्वेरी बस उन सभी Subjects (सफेदसूचीबद्ध को छोड़कर) और Namespaces का चयन करती है जिन तक उनकी पहुंच है। ध्यान दें कि परिणाम सेट में केवल उन Subjects को शामिल किया जाएगा जिनके पास 2 से अधिक Namespaces तक पहुंच है (वहाँ threshold मान देखा?). अंतिम writer की अभिव्यक्ति को स्वरूपित परिणाम आइटम आउटपुट के रूप में कैप्चर किया जाएगा।
writer क्वेरी द्वारा लौटाए गए तत्वों से मेल खाने वाली विधियों के साथ result ऑब्जेक्ट के माध्यम से परिणाम सेट आइटम तक पहुंच सकता है, उदा. result.subject_kind, result.subject_name आदि।
नोट:
writer अभिव्यक्ति में {{threshold}} प्लेसहोल्डर को नियम के threshold कीवर्ड मान से बदल दिया जाएगा।{{whitelist_subject_names}} एक कस्टम फ़ील्ड का प्रतिनिधित्व करता है जिसे किसी दिए गए नियम id के लिए परिभाषित Whitelist मानों के साथ अंतर्निहित किया जाएगा। यदि व्हाइटलिस्ट में प्लेसहोल्डर फ़ील्ड नाम परिभाषित नहीं है, तो इसे डिफ़ॉल्ट रूप से एक खाली सरणी [''] से बदल दिया जाएगा। व्हाइटलिस्टिंग के बारे में नीचे और पढ़ें।बिल्ट-इन टेम्पलेट जोखिम नियम परिभाषा को काफी सरल बनाते हैं, हालांकि, वे विशिष्ट प्रकार की जानकारी निकालने के लिए डिज़ाइन किए गए हैं और आपके कस्टम नियमों के लिए उपयुक्त नहीं हो सकते हैं। यदि आप एक ही query या writer अभिव्यक्तियों को कई नियमों में पुन: उपयोग करते हुए पाते हैं, तो आपको उन्हें macro में निकालने और अपने कस्टम नियमों में संदर्भित करने पर विचार करना चाहिए ताकि उन्हें DRY किया जा सके।```yaml
ऊपर दिया गया उदाहरण एक अंतर्निर्मित नियम को दर्शाता है। यह `risky-role` टेम्पलेट को संदर्भित करता है जो प्रसंस्करण के दौरान नियम मूल्यांकन ट्रिगर होने से पहले `query` और `writer` एक्सप्रेशन इंजेक्ट करके नियम का विस्तार करेगा। उपयुक्त मैच क्वेरी बनाने के लिए `match_rules` का उपयोग किया जाएगा।
### RBAC जोखिम श्वेतसूची
वैकल्पिक श्वेतसूची में कस्टम परिभाषित विशेषता नामों और संबंधित (श्वेतसूचीबद्ध) मानों का एक सेट होता है।
#### श्वेतसूची विशेषताएँ
विशेषता नाम और उनके मान मनमाने होते हैं। वे [Whitelist](https://github.com/appvia/krane/blob/HEAD/config/whitelist.yaml) फ़ाइल में परिभाषित किए गए हैं और तीन अलग-अलग वर्गों में विभाजित हैं:
- `global` - शीर्ष स्तरीय दायरा। यहाँ परिभाषित कस्टम विशेषताएँ क्लस्टर नाम की परवाह किए बिना सभी जोखिम नियमों पर लागू होंगी।
- `common` - कस्टम विशेषताएँ क्लस्टर नाम की परवाह किए बिना विशिष्ट जोखिम नियम `id` तक सीमित होंगी।
- `cluster` (क्लस्टर नामों की नेस्टेड सूची के साथ) - कस्टम विशेषताएँ किसी दिए गए क्लस्टर नाम के लिए विशिष्ट जोखिम नियम `id` पर लागू होंगी।
प्रत्येक [जोखिम नियम](#rbac-risk-rules) मूल्यांकन के दौरान, `query` में प्रयुक्त सभी पैरामीटर प्लेसहोल्डर का इंटरपोलेशन करने का प्रयास करेगा, जैसे `{{your_whitelist_attribute_name}}`। यदि एक प्लेसहोल्डर पैरामीटर नाम (अर्थात दोहरे घुंघराले ब्रैकेट के बीच का नाम) उस जोखिम नियम `id` के लिए किसी भी श्वेतसूचीबद्ध विशेषता नाम से मेल खाता है, तो इसे इसके गणना किए गए मान से बदल दिया जाएगा।
यदि किसी दिए गए प्लेसहोल्डर के लिए कोई मान नहीं मिलता है, तो इसे `['']` से प्रतिस्थापित किया जाएगा।
#### श्वेतसूची उदाहरण
नीचे दी गई उदाहरण श्वेतसूची एक [जोखिम नियम](#rbac-risk-rules) के लिए `placeholder-key => value` मैपिंग उत्पन्न करती है जिसका `id` विशेषता मान _"some-risk-rule-id"_ से मेल खाता है।```
{{whitelist_role_names}} => ['acp:prometheus:operator']
{{whitelist_subject_names}} => ['privileged-psp-user', 'another-user']
rules: global: # global scope - applies to all risk rule and cluster names whitelist_role_names: # custom attribute name - acp:prometheus:operator # custom attribute values
common: # common scope - applies to specific risk rule id regardless of cluster name some-risk-rule-id: # this corresponds to risk rule id defined in config/rules.yaml whitelist_subject_names: # custom attribute name - privileged-psp-user # custom attribute values
cluster: # cluster scope - applies to speciifc risk rule id and cluster name default: # example cluster name some-risk-rule-id: # risk rule id whitelist_subject_names: # custom attribute nane - another-user # custom attribute values
## Kubernetes तैनाती
_Krane_ को स्थानीय या दूरस्थ Kubernetes क्लस्टरों पर आसानी से तैनात किया जा सकता है।
### K8s पूर्वापेक्षाएँ
Kubernetes नेमस्पेस, सेवा खाता और उपयुक्त RBAC क्लस्टर में मौजूद होना चाहिए। संदर्भ के लिए [पूर्वापेक्षाएँ](https://github.com/appvia/krane/blob/HEAD/k8s/one-time/prerequisites.yaml) देखें।
डिफ़ॉल्ट _Krane_ प्रवेश बिंदु [bin/in-cluster-run](https://github.com/appvia/krane/blob/HEAD/bin/in-cluster-run) निष्पादित करता है जो RBAC _रिपोर्ट_ लूप और _डैशबोर्ड_ वेब सर्वर शुरू करने से पहले RedisGraph इंस्टेंस के उपलब्ध होने की प्रतीक्षा करता है।
आप निम्नलिखित पर्यावरण चरों के साथ क्लस्टर निष्पादन के कुछ पहलुओं को नियंत्रित कर सकते हैं:
* `KRANE_REPORT_INTERVAL` - RBAC स्थैतिक विश्लेषण रिपोर्ट रन के लिए सेकंड में अंतराल को परिभाषित करता है। डिफ़ॉल्ट: `300` (सेकंड में, अर्थात 5 मिनट)।
* `KRANE_REPORT_OUTPUT` - RBAC जोखिम रिपोर्ट आउटपुट प्रारूप को परिभाषित करता है। संभावित मान `:json`, `:yaml`, `:none`। डिफ़ॉल्ट: `:json`।
### स्थानीय या दूरस्थ K8s क्लस्टर
#### Helm चार्ट
शुरू करने से पहले, आपको निम्नलिखित टूल्स की आवश्यकता होगी:
* [Helm CLI](https://helm.sh/docs/intro/install/)
Helm चार्ट स्थापित करें:```sh
$ helm repo add appvia https://appvia.github.io/krane
$ helm repo update
$ helm install krane appvia/krane --namespace krane --create-namespace
देखें values.yaml फ़ाइल में अन्य सेट करने योग्य विकल्पों और पैरामीटरों के विवरण के लिए।
kubectl create
--context
--namespace krane
-f k8s/redisgraph-service.yaml
-f k8s/redisgraph-deployment.yaml
-f k8s/krane-service.yaml
-f k8s/krane-deployment.yaml
ध्यान दें कि _Krane_ डैशबोर्ड सेवा डिफ़ॉल्ट रूप से उजागर नहीं है!```sh
kubectl port-forward svc/krane 8000 \
--context=<docker-desktop> \
--namespace=krane
# Open Krane dashboard at http://localhost:8000
आप उदाहरण तैनाती मेनिफेस्ट k8s निर्देशिका में पा सकते हैं।
अपनी तैनाती के लिए आवश्यकतानुसार मेनिफेस्ट को संशोधित करें, यह सुनिश्चित करते हुए कि आप अपने तैनाती फ़ाइल में Krane डॉकर इमेज के सही संस्करण का संदर्भ दे रहे हैं। उपलब्ध टैग के लिए Krane Docker Registry देखें, या बस latest का उपयोग करें।
यदि आपके K8s क्लस्टर में अंतर्निहित Compose-on-Kubernetes नियंत्रक समर्थन है (docker-desktop डिफ़ॉल्ट रूप से इसका समर्थन करता है), तो आप एक एकल docker stack कमांड के साथ Krane और इसकी निर्भरताओं को तैनात कर सकते हैं:```sh
docker stack deploy
--orchestrator kubernetes
--namespace krane
--compose-file docker-compose.yml
--compose-file docker-compose.k8s.yml krane
नोट: उपरोक्त कमांड चलाने से पहले सुनिश्चित करें कि आपका वर्तमान kube context सही तरीके से सेट है!
एप्लिकेशन Stack अब Kubernetes क्लस्टर में डिप्लॉय किया जाना चाहिए और सभी सेवाएँ तैयार और एक्स्पोज़्ड होनी चाहिए। ध्यान दें कि _Krane_ अपने आप अपना report loop और dashboard server शुरू कर देगा।```sh
docker stack services --orchestrator kubernetes --namespace krane krane
उपरोक्त कमांड निम्नलिखित आउटपुट उत्पन्न करेगा:``` ID NAME MODE REPLICAS IMAGE PORTS 0de30651-dd5 krane_redisgraph replicated 1/1 redislabs/redisgraph:1.99.7 *:6379->6379/tcp aa377a5f-62b krane_krane replicated 1/1 quay.io/appvia/krane:latest *:8000->8000/tcp
अपने Kubernetes क्लस्टर के RBAC सुरक्षा आसन की जाँच करें http://localhost:8000 पर जाकर।
ध्यान दें कि दूरस्थ क्लस्टर परिनियोजन के लिए आपको संभवतः पहले _Krane_ सेवा को पोर्ट-फ़ॉरवर्ड करना होगा।```sh
kubectl --context=my-remote-cluster --namespace=krane port-forward svc/krane 8000
Stack को हटाने के लिए```sh
docker stack rm krane
--orchestrator kubernetes
--namespace krane
## सूचनाएँ
Krane आपको स्लैक एकीकरण के माध्यम से मध्यम और उच्च गंभीरता की पहचान की गई विसंगतियों के बारे में सूचित करेगा।
सूचनाएँ सक्षम करने के लिए [config/config.yaml](https://github.com/appvia/krane/blob/HEAD/config/config.yaml) फ़ाइल में Slack `webhook_url` और `channel` निर्दिष्ट करें, या वैकल्पिक रूप से `SLACK_WEBHOOK_URL` और `SLACK_CHANNEL` दोनों पर्यावरण चर सेट करें। पर्यावरण चर कॉन्फ़िग फ़ाइल मानों पर प्राथमिकता लेंगे।
## स्थानीय विकास
यह खंड स्थानीय विकास को सक्षम करने के चरणों का वर्णन करता है।
### सेटअप
_Krane_ कोड निर्भरताएँ स्थापित करें इसके साथ```sh
./bin/setup
Krane RedisGraph पर निर्भर करता है। docker-compose Krane की निर्भरताओं को स्थानीय रूप से चलाने का सबसे तेज़ तरीका है।```sh
docker-compose up -d redisgraph
RedisGraph सेवा चालू है यह जाँचने के लिए:```sh
docker-compose ps
सेवाओं को रोकने के लिए:```sh docker-compose down
### विकास
इस बिंदु पर आपको स्थानीय शेल में कमांड लागू करके _Krane_ कोडबेस और परीक्षण परिणामों को संशोधित करने में सक्षम होना चाहिए।```sh
$ ./bin/krane --help # to get help
$ ./bin/krane report -k docker-desktop # to generate your first report for
# local docker-desktop k8s cluster
...
Dashboard UI स्थानीय विकास मोड को सक्षम करने के लिए```sh $ cd dashboard $ npm install $ npm start
यह स्वचालित रूप से डैशबोर्ड सर्वर शुरू करेगा, डिफ़ॉल्ट ब्राउज़र खोलेगा और स्रोत फ़ाइलों में परिवर्तनों पर नज़र रखेगा।
_Krane_ बेहतर डेवलपर अनुभव के लिए [Skaffold](https://skaffold.dev/) के साथ पूर्व-कॉन्फ़िगर आता है। स्थानीय या रिमोट Kubernetes क्लस्टर में पूरे स्टैक को चलाकर प्रोजेक्ट पर पुनरावृत्ति और एप्लिकेशन को मान्य करना अब और आसान हो गया है।
कोड हॉट-रीलोड स्थानीय परिवर्तनों को तेज़ डेवलपमेंट लाइफसाइकिल के लिए चल रहे कंटेनर में स्वचालित रूप से प्रचारित करने में सक्षम बनाता है।```sh
skaffold dev --kube-context docker-desktop --namespace krane --port-forward
स्थानीय रूप से परीक्षण चलाएँ के साथ```sh bundle exec rspec
## Krane में योगदान
हम समुदाय से किसी भी तरह के योगदान का स्वागत करते हैं! आरंभ करने के तरीके के बारे में अधिक जानकारी के लिए कृपया हमारी [योगदान](https://github.com/appvia/krane/blob/HEAD/CONTRIBUTING.md) मार्गदर्शिका देखें। यदि आप _Krane_ का उपयोग करते हैं, इसे उपयोगी पाते हैं, या सामान्यतः Kubernetes सुरक्षा में रुचि रखते हैं, तो कृपया इस रिपॉजिटरी को **स्टार** और **वॉच** करके हमें बताएं। धन्यवाद!
## शामिल हों
हमारे [समुदाय चैनल](https://www.appvia.io/join-the-appvia-community) पर चर्चा में शामिल हों।
Krane एक सामुदायिक परियोजना है और हम आपके योगदान का स्वागत करते हैं। किसी बग की रिपोर्ट करने, सुधार का सुझाव देने, या नई सुविधा का अनुरोध करने के लिए कृपया एक Github समस्या खोलें। आप कैसे मदद कर सकते हैं, इस बारे में अधिक जानकारी के लिए हमारी [योगदान](https://github.com/appvia/krane/blob/HEAD/CONTRIBUTING.md) मार्गदर्शिका देखें।
## रोडमैप
परियोजना की हमारी योजनाओं के बारे में विवरण के लिए हमारा [रोडमैप](https://github.com/appvia/krane/projects/1) देखें।
## लाइसेंस
लेखक: Marcin Ciszak <[email protected]>
कॉपीराइट (c) 2019-2020 [Appvia Ltd](https://appvia.io)
यह परियोजना [अपाचे लाइसेंस, संस्करण 2.0](https://github.com/appvia/krane/blob/HEAD/LICENSE) के तहत वितरित की गई है।