Details
| ID | MinIO |
|---|---|
| Provider | MinIO Inc |
| Category | Database |
| From Version | 6.0.0 |
| Docker Image | demisto/py3-tools:1.0.0.114656 |
| Supported Modules | Agentix XSIAM |
README
An Integration with MinIO Object Storage
This integration was integrated and tested with RELEASE.2020-12 of MinIO.
Configure MinIO in Cortex
| Parameter | Description | Required |
|---|---|---|
| server | Server Name or Address (e.g. 8.8.8.8) | True |
| port | Port Number | True |
| access_key | Access Key | True |
| access_secret | Access Secret | True |
| ssl | Connect over SSL | False |
Commands
You can execute these commands from the CLI, as part of an automation, or in a playbook.
After you successfully execute a command, a DBot message appears in the War Room with the command details.
minio-make-bucket
Create a new bucket.
Base Command
minio-make-bucket
Input
| Argument Name | Description | Required |
|---|---|---|
| name | Bucket Name. | Required |
Context Output
| Path | Type | Description |
|---|---|---|
| MinIO.Buckets.bucket | Unknown | MinIO Bucket Name |
| MinIO.Buckets.status | Unknown | MinIO Bucket Status |
Command Example
!minio-make-bucket name="test20"
Context Example
{
"MinIO": {
"Buckets": {
"bucket": "test20",
"status": "created"
}
}
}
Human Readable Output
Results
bucket status test20 created
minio-remove-bucket
Remove an existing bucket.
Base Command
minio-remove-bucket
Input
| Argument Name | Description | Required |
|---|---|---|
| name | Bucket Name. | Required |
Context Output
| Path | Type | Description |
|---|---|---|
| MinIO.Buckets.bucket | Unknown | MinIO Bucket Name |
| MinIO.Buckets.status | Unknown | MinIO Bucket Status |
Command Example
!minio-remove-bucket name="test20"
Context Example
{
"MinIO": {
"Buckets": {
"bucket": "test20",
"status": "removed"
}
}
}
Human Readable Output
Results
bucket status test20 removed
minio-list-buckets
List All MinIO Buckets
Base Command
minio-list-buckets
Input
There are no input arguments for this command.
Context Output
| Path | Type | Description |
|---|---|---|
| MinIO.Buckets | Unknown | MinIO Buckets |
Command Example
#### Context Example
```json
{
"MinIO": {
"Buckets": [
{
"bucket": "opencti-bucket",
"creation_date": "2020-12-18 17:06:04.887000+00:00"
},
{
"bucket": "test1",
"creation_date": "2020-12-29 10:54:39.996000+00:00"
},
{
"bucket": "test10",
"creation_date": "2020-12-29 10:45:46.962000+00:00"
}
]
}
}
Human Readable Output
Results
bucket creation_date opencti-bucket 2020-12-18 17:06:04.887000+00:00 test1 2020-12-29 10:54:39.996000+00:00 test10 2020-12-29 10:45:46.962000+00:00
minio-list-objects
Lists object information of a bucket.
Base Command
minio-list-objects
Input
| Argument Name | Description | Required |
|---|---|---|
| bucket_name | Name of the bucket. | Required |
| prefix | Object name starts with prefix. | Optional |
| start_after | List objects after this key name. | Optional |
| include_user_meta | MinIO specific flag to control to include user metadata. Possible values are: True, False. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| MinIO.Objects | Unknown | MinIO Objects |
Command Example
!minio-list-objects bucket_name="test10"
Context Example
{
"MinIO": {
"Objects": [
{
"bucket": "test10",
"etag": "4be6f1e4bda138a555416b866a90530c",
"is_dir": false,
"last_modified": "2020-12-29 10:46:04.387000+00:00",
"object": "MINIO_wordmark.png",
"size": 11496
},
{
"bucket": "test10",
"etag": "c4e3802707693c8df821b37c91c0cfd8",
"is_dir": false,
"last_modified": "2020-12-30 06:10:37.886000+00:00",
"object": "test.txt",
"size": 9
},
{
"bucket": "test10",
"etag": "7a6add52bec4ca39eedeea16927c92e3",
"is_dir": false,
"last_modified": "2020-12-30 06:12:33.487000+00:00",
"object": "test.yml",
"size": 34960
}
]
}
}
Human Readable Output
Results
bucket etag is_dir last_modified object size test10 4be6f1e4bda138a555416b866a90530c false 2020-12-29 10:46:04.387000+00:00 MINIO_wordmark.png 11496 test10 c4e3802707693c8df821b37c91c0cfd8 false 2020-12-30 06:10:37.886000+00:00 test.txt 9 test10 7a6add52bec4ca39eedeea16927c92e3 false 2020-12-30 06:12:33.487000+00:00 test.yml 34960
minio-get-object
Gets data from offset to length of an object.
Base Command
minio-get-object
Input
| Argument Name | Description | Required |
|---|---|---|
| bucket_name | Bucket Name. | Required |
| name | Object Name. | Required |
| offset | Start byte position of object data. | Optional |
| length | Number of bytes of object data from offset. Possible values are: . | Optional |
| request_headers | Any additional headers to be added with GET request. | Optional |
| extra_query_params | Extra query parameters for advanced usage. | Optional |
Context Output
There is no context output for this command.
Command Example
!minio-get-object bucket_name="test10" name="MINIO_wordmark.png"
Context Example
{
"File": {
"EntryID": "399@58b146a9-f748-4f65-8846-a1d63c7e77f4",
"Extension": "png",
"Info": "image/png",
"MD5": "4be6f1e4bda138a555416b866a90530c",
"Name": "MINIO_wordmark.png",
"SHA1": "568f64faee0471c811e6ef5234428751236f9ad2",
"SHA256": "d53ad84d5c44a6991b0b6109703aff663d5d016ee93762eaf46624144f1c6fc5",
"SHA512": "8d5ba7577cd2a98c0a973997978c31700996d54dd76e332a108fdb5a4694e55c7c172c8bae1d1189810b4d766bbffa52c6f1acb599c5679666a4e8368241a710",
"SSDeep": "192:DBfcNvyaPaOjCOSXA/DA47c6qurTlvUnHjXoRBVaYuKY7BF019UtNB2KBlloHfoe:iB1PaO7SXA/DA47LqqToD6TaYufAcJNq",
"Size": 11496,
"Type": "PNG image data, 2401 x 362, 8-bit colormap, non-interlaced"
}
}
Human Readable Output
minio-stat-object
Get object information and metadata of an object.
Base Command
minio-stat-object
Input
| Argument Name | Description | Required |
|---|---|---|
| bucket_name | Bucket Name. | Required |
| name | Object Name. | Required |
| extra_query_params | Extra query parameters for advanced usage. | Optional |
Context Output
There is no context output for this command.
Command Example
!minio-stat-object bucket_name="test10" name="test.txt"
Context Example
{
"MinIO": {
"Objects": {
"bucket": "test10",
"content-type": "application/octet-stream",
"etag": "\"c4e3802707693c8df821b37c91c0cfd8\"",
"object": "test.txt",
"size": 9
}
}
}
Human Readable Output
Results
bucket content-type etag object size test10 application/octet-stream “c4e3802707693c8df821b37c91c0cfd8” test.txt 9
minio-remove-object
Remove an object.
Base Command
minio-remove-object
Input
| Argument Name | Description | Required |
|---|---|---|
| bucket_name | Bucket Name. | Required |
| name | Object Name. | Required |
Context Output
| Path | Type | Description |
|---|---|---|
| MinIO.Objects.name | Unknown | Object Name |
| MinIO.Objects.status | Unknown | Object Status |
Command Example
!minio-remove-object bucket_name="test10" name="test.txt"
Context Example
{
"MinIO": {
"Objects": {
"bucket": "test10",
"object": "test.txt",
"status": "removed"
}
}
}
Human Readable Output
Results
bucket object status test10 test.txt removed
minio-fput-object
Uploads data from a file to an object in a bucket.
Base Command
minio-fput-object
Input
| Argument Name | Description | Required |
|---|---|---|
| bucket_name | Bucket Name. Possible values are: . | Required |
| entry_id | File Entry ID. | Required |
| content_type | File Type. | Optional |
| metadata | Any additional metadata to be uploaded along with your PUT request. | Optional |
Context Output
There is no context output for this command.
Command Example
!minio-fput-object bucket_name="test10" entry_id="297@58b146a9-f748-4f65-8846-a1d63c7e77f4"
Context Example
{
"MinIO": {
"Objects": {
"bucket": "test10",
"object": "test.yml",
"status": "uploaded"
}
}
}
Human Readable Output
Results
bucket object status test10 test.yml uploaded
minio-put-object
Uploads data from a stream to an object in a bucket.
Base Command
minio-put-object
Input
| Argument Name | Description | Required |
|---|---|---|
| bucket_name | Bucket Name. Possible values are: . | Required |
| data | Contains object data. | Required |
| name | Object name in the bucket. | Required |
| content_type | File Type. | Optional |
| metadata | Any additional metadata to be uploaded along with your PUT request. | Optional |
Context Output
There is no context output for this command.
Command Example
!minio-put-object bucket_name="test10" data="'test100'" name="test.txt"
Context Example
{
"MinIO": {
"Objects": {
"bucket": "test10",
"object": "test.txt",
"status": "uploaded"
}
}
}
Human Readable Output
Results
bucket object status test10 test.txt uploaded
minio-get-tags
Get tags configuration of an object.
Base Command
minio-get-tags
Input
| Argument Name | Description | Required |
|---|---|---|
| bucket_name | Bucket Name. | Required |
| name | Object name in the bucket. | Required |
Context Output
| Path | Type | Description |
|---|---|---|
| MinIO.Objects.bucket | Unknown | Bucket Name. |
| MinIO.Objects.object | Unknown | Object Name. |
| MinIO.Objects.tags | Unknown | Object Tags. |
Command Example
!minio-get-tags bucket_name="test11" name="test.txt"
Context Example
{
"MinIO": {
"Objects": {
"bucket": "test11",
"object": "test.txt",
"status": "completed",
"tags": {
"test": "test"
}
}
}
}
minio-set-tag
Set tags configuration to an object.
Base Command
minio-set-tag
Input
| Argument Name | Description | Required |
|---|---|---|
| bucket_name | Bucket Name. | Required |
| name | Object name in the bucket. | Required |
| tag_key | Key for the tag to add on the object. | Required |
| tag_value | Value for the tag to add on the object. | Required |
Context Output
| Path | Type | Description |
|---|---|---|
| MinIO.Objects.bucket | Unknown | Bucket Name. |
| MinIO.Objects.object | Unknown | Object Name. |
| MinIO.Objects.tags | Unknown | Object Tags. |
Command Example
!minio-set-tag bucket_name="test11" name="test.txt" tag_key="status" tag_value="in_progress"
Context Example
{
"MinIO": {
"Objects": {
"bucket": "test11",
"object": "test.txt",
"status": "completed",
"tags": {
"test": "test",
"status": "in_progress"
}
}
}
}
minio-copy-object
Create an object by server-side copying data from another object.
Base Command
minio-copy-object
Input
| Argument Name | Description | Required |
|---|---|---|
| bucket_name_src | Bucket Name to copy object from. | Required |
| name_src | Object name to copy. | Required |
| bucket_name_dst | Bucket Name to copy object to. | Required |
| name_dst | Object name copied. | Required |
| metadata | Any user-defined metadata to be copied along with destination object. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| MinIO.Objects.bucket | Unknown | Bucket Name. |
| MinIO.Objects.object | Unknown | Object Name |
| MinIO.Objects.status | Unknown | Object Status |
Command Example
!minio-copy-object bucket_name_src="test12" name_src="test_source.txt" bucket_name_dst="test12" name_dst="test_destination.txt"
!minio-copy-object bucket_name_src="test12" name_src="test_source.txt" bucket_name_dst="test12" name_dst="myFolder/test_destination.txt" (It will create the folder myFolder)
Context Example
{
"MinIO": {
"Objects": {
"bucket": "test12",
"object": "test_destination.txt",
"status": "copied"
}
}
}
Configuration parameters
server— Server Name or Address (e.g. 8.8.8.8) (required)port— Port Number (required)access_key— Access Key (required)access_secret— Access Secret (required)ssl— Connect over SSL
Commands (12)
-
minio-copy-objectCreate an object by server-side copying data from another object.
-
minio-fput-objectUploads data from a file to an object in a bucket.
-
minio-get-objectGets data from offset to length of an object.
-
minio-get-tagsGet tags configuration of an object.
-
minio-list-bucketsList All MinIO Buckets.
-
minio-list-objectsLists object information of a bucket.
-
minio-make-bucketCreate a new bucket.
-
minio-put-objectUploads data from a stream to an object in a bucket.
-
minio-remove-bucketRemove an existing bucket.
-
minio-remove-objectRemove an object.
-
minio-set-tagSet tags configuration to an object.
-
minio-stat-objectGet object information and metadata of an object.
import io import urllib3 from CommonServerPython import * from minio import Minio from minio.commonconfig import REPLACE, CopySource, Tags # pylint: disable=E0401, E0611 class Client(Minio): def __init__(self, endpoint, access_key, secret_key, secure=False): super().__init__(endpoint=endpoint, access_key=access_key, secret_key=secret_key, secure=secure) def make_bucket_command(client, args): response = [] name = str(args.get("name", "")) client.make_bucket(bucket_name=name) response.append({"bucket": name, "status": "created"}) command_results = CommandResults( outputs_prefix="MinIO.Buckets", outputs_key_field="bucket", outputs=response, raw_response=response, ) return command_results def remove_bucket_command(client, args): response = [] name = str(args.get("name", "")) client.remove_bucket(bucket_name=name) response.append({"bucket": name, "status": "removed"}) command_results = CommandResults( outputs_prefix="MinIO.Buckets", outputs_key_field="bucket", outputs=response, raw_response=response, ) return command_results def list_buckets_command(client, args): response = [] buckets = client.list_buckets() for bucket in buckets: response.append({"bucket": bucket.name, "creation_date": str(bucket.creation_date)}) command_results = CommandResults( outputs_prefix="MinIO.Buckets", outputs_key_field="bucket", outputs=response, raw_response=response, ) return command_results def list_objects_command(client, args): response = [] bucket_name = str(args.get("bucket_name")) prefix = args.get("prefix") start_after = args.get("start_after") include_user_meta = args.get("include_user_meta", False) objects = client.list_objects( bucket_name=bucket_name, prefix=prefix, start_after=start_after, include_user_meta=include_user_meta ) for stored_object in objects: response.append( { "bucket": bucket_name, "object": stored_object.object_name, "is_dir": stored_object.is_dir, "size": stored_object.size, "etag": stored_object.etag, "last_modified": str(stored_object.last_modified), } ) command_results = CommandResults( outputs_prefix="MinIO.Objects", outputs_key_field="bucket,object", outputs=response, raw_response=response, ) return command_results def get_object_command(client, args): response = None bucket_name = str(args.get("bucket_name")) object_name = str(args.get("name")) offset = int(args.get("offset", 0)) length = int(args.get("length", 0)) extra_query_params = args.get("extra_query_params", None) request_headers = args.get("request_headers", None) object_bytes = None try: response = client.get_object( bucket_name=bucket_name, object_name=object_name, offset=offset, length=length, extra_query_params=extra_query_params, request_headers=request_headers, ) object_bytes = response.read() finally: if response: response.close() response.release_conn() return fileResult(filename=object_name, data=object_bytes) def stat_object_command(client, args): response = [] bucket_name = str(args.get("bucket_name")) object_name = str(args.get("name")) extra_query_params = args.get("extra_query_params", None) object_stats = client.stat_object(bucket_name=bucket_name, object_name=object_name, extra_query_params=extra_query_params) response.append( { "bucket": bucket_name, "object": object_name, "content-type": object_stats.metadata.get("Content-Type"), "etag": object_stats.metadata.get("ETag"), "size": object_stats.size, } ) command_results = CommandResults( outputs_prefix="MinIO.Objects", outputs_key_field="bucket,object", outputs=response, raw_response=response, ) return command_results def remove_object_command(client, args): response = [] name = str(args.get("name", "")) bucket_name = str(args.get("bucket_name", "")) client.remove_object(object_name=name, bucket_name=bucket_name) response.append({"bucket": bucket_name, "object": name, "status": "removed"}) command_results = CommandResults( outputs_prefix="MinIO.Objects", outputs_key_field="bucket,object", outputs=response, raw_response=response, ) return command_results def fput_object_command(client, args): response = [] bucket_name = str(args.get("bucket_name", "")) entry_id = args.get("entry_id", "") content_type = args.get("content_type", "application/octet-stream") metadata = args.get("metadata", None) get_file_path_res = demisto.getFilePath(entry_id) object_path = get_file_path_res["path"] object_name = get_file_path_res["name"] client.fput_object( object_name=object_name, bucket_name=bucket_name, file_path=object_path, content_type=content_type, metadata=metadata ) response.append({"bucket": bucket_name, "object": object_name, "status": "uploaded"}) command_results = CommandResults( outputs_prefix="MinIO.Objects", outputs_key_field="bucket,object", outputs=response, raw_response=response, ) return command_results def put_object_command(client, args): response = [] bucket_name = str(args.get("bucket_name", "")) object_name = str(args.get("name")) data_bytes = args.get("data").encode("utf-8") content_type = args.get("content_type", "application/octet-stream") metadata = args.get("metadata", None) data = io.BytesIO(data_bytes) client.put_object( object_name=object_name, bucket_name=bucket_name, data=data, content_type=content_type, metadata=metadata, length=len(data_bytes), ) response.append({"bucket": bucket_name, "object": object_name, "status": "uploaded"}) command_results = CommandResults( outputs_prefix="MinIO.Objects", outputs_key_field="bucket,object", outputs=response, raw_response=response, ) return command_results def copy_object_command(client, args): bucket_name_src = args.get("bucket_name_src", "") object_name_src = args.get("name_src") bucket_name_dst = args.get("bucket_name_dst", "") object_name_dst = args.get("name_dst") metadata = args.get("metadata", None) client.copy_object( bucket_name_dst, object_name_dst, CopySource(bucket_name_src, object_name_src), metadata=metadata, metadata_directive=REPLACE, ) res = {"bucket": bucket_name_dst, "object": object_name_dst, "status": "copied"} command_results = CommandResults( outputs_prefix="MinIO.Objects", outputs_key_field=["bucket", "object"], outputs=res, raw_response=res, ) return command_results def get_tags_command(client, args): bucket_name = args.get("bucket_name", "") object_name = args.get("name") tag = client.get_object_tags(bucket_name=bucket_name, object_name=object_name) res = {"bucket": bucket_name, "object": object_name, "status": "completed"} if tag: res["tags"] = tag command_results = CommandResults( outputs_prefix="MinIO.Objects", outputs_key_field=["bucket", "object"], outputs=res, raw_response=res, ) return command_results def set_tag_command(client, args): bucket_name = args.get("bucket_name", "") object_name = args.get("name") tag_key = args.get("tag_key") tag_value = args.get("tag_value") existing_tag = client.get_object_tags(bucket_name=bucket_name, object_name=object_name) tags = Tags.new_object_tags() tags[tag_key] = tag_value if existing_tag: tags.update(existing_tag) client.set_object_tags(bucket_name, object_name, tags) res = {"bucket": bucket_name, "object": object_name, "tags": tags, "status": "completed"} command_results = CommandResults( outputs_prefix="MinIO.Objects", outputs_key_field=["bucket", "object"], outputs=res, raw_response=res, ) return command_results def test_module(client): # Test functions here client.list_buckets() demisto.results("ok") def main(): params = demisto.params() args = demisto.args() server = params.get("server") port = params.get("port", "9000") access_key = params.get("access_key") access_secret = params.get("access_secret") secure_connection = params.get("ssl", False) endpoint = server + ":" + port command = demisto.command() LOG(f"Command being called is {command}") try: urllib3.disable_warnings() client = Client(endpoint=endpoint, access_key=access_key, secret_key=access_secret, secure=secure_connection) commands = { "minio-make-bucket": make_bucket_command, "minio-remove-bucket": remove_bucket_command, "minio-list-buckets": list_buckets_command, "minio-list-objects": list_objects_command, "minio-get-object": get_object_command, "minio-stat-object": stat_object_command, "minio-remove-object": remove_object_command, "minio-fput-object": fput_object_command, "minio-put-object": put_object_command, "minio-copy-object": copy_object_command, "minio-get-tags": get_tags_command, "minio-set-tag": set_tag_command, } if command == "test-module": test_module(client) else: return_results(commands[command](client, args)) except Exception as e: return_error(str(e)) if __name__ in ["__main__", "builtin", "builtins"]: main()