[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6AFE93W8HRBSCM102MA22FD":3,"skill-same:01M6AFE93W8HRBSCM102MA22FD":110},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":29,"publishedAt":50,"linkOnly":51,"markdownContent":52,"markdownBody":53,"frontMatter":54,"refName":69,"commitSha":70,"skillDirectory":71,"forksCount":72,"repositoryHtmlUrl":73,"repositoryHomepageUrl":74,"ownerHtmlUrl":75,"ownerBlogUrl":76,"ownerDescription":77,"updatedAt":78,"install":79,"resources":92},"01M6AFE93W8HRBSCM102MA22FD","implementing-taxii-server-with-opentaxii",null,"Deploy and configure a TAXII 2.1 server (Medallion) with Docker, publish and consume STIX 2.1 bundles across collections, and integrate the feed with SIEM\u002FSOAR platforms for automated indicator exchange between organizations. Use when standing up a TAXII server to share threat intel, configuring collections for CTI feeds, or automating STIX indicator ingestion into a SIEM\u002FSOAR.","mukul975\u002FAnthropic-Cybersecurity-Skills","mukul975","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F42860185?v=4","01M6ADEQR8T5M4EEG6C67BQCWF","Mahipal","01M6ADJPMYWG1E5GM1FWBE3128",35990,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fmukul975\u002FAnthropic-Cybersecurity-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fimplementing-taxii-server-with-opentaxii\u002FSKILL.md",[18,23,26],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署",{"categoryNo":27,"categoryName":28,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49],"implementing taxii server with opentaxii","server","TAXII","stix","taxii-server","indicator-exchange","opentaxii","feeds","sharing","threat-sharing","publish","docker","cti","threat-intelligence","share","deploy","automation","soar","siem","cybersecurity","2026-11-10 10:12:30",false,"---\nname: implementing-taxii-server-with-opentaxii\ndescription: Deploy and configure a TAXII 2.1 server (Medallion) with Docker, publish\n  and consume STIX 2.1 bundles across collections, and integrate the feed with SIEM\u002FSOAR\n  platforms for automated indicator exchange between organizations. Use when standing\n  up a TAXII server to share threat intel, configuring collections for CTI feeds,\n  or automating STIX indicator ingestion into a SIEM\u002FSOAR.\ndomain: cybersecurity\nsubdomain: threat-intelligence\ntags:\n- taxii\n- stix\n- opentaxii\n- threat-sharing\n- cti\n- indicator-exchange\n- taxii-server\n- automation\nversion: '1.0'\nauthor: mahipal\nlicense: Apache-2.0\nnist_csf:\n- ID.RA-01\n- ID.RA-05\n- DE.CM-01\n- DE.AE-02\nmitre_attack:\n- T1591\n- T1592\n- T1593\n- T1589\n---\n# Implementing TAXII Server with OpenTAXII\n\n## Overview\n\nTAXII (Trusted Automated eXchange of Intelligence Information) is an OASIS standard protocol for exchanging cyber threat intelligence over HTTPS. OpenTAXII is an open-source TAXII server implementation by EclecticIQ that supports TAXII 1.x, while the OASIS cti-taxii-server provides a TAXII 2.1 reference implementation. This skill covers deploying a TAXII server, configuring collections for threat intelligence feeds, publishing STIX 2.1 bundles, and integrating with SIEM\u002FSOAR platforms for automated indicator ingestion.\n\n\n## When to Use\n\n- When deploying or configuring implementing taxii server with opentaxii capabilities in your environment\n- When establishing security controls aligned to compliance requirements\n- When building or improving security architecture for this domain\n- When conducting security assessments that require this implementation\n\n## Prerequisites\n\n- Python 3.9+ with `medallion`, `stix2`, `taxii2-client`, `opentaxii`, `cabby` libraries\n- Docker and Docker Compose for containerized deployment\n- Understanding of STIX 2.1 objects (Indicator, Malware, Attack Pattern, Relationship)\n- Familiarity with REST APIs and HTTPS configuration\n- TLS certificates for production deployment\n\n## Key Concepts\n\n### TAXII 2.1 Architecture\n\nTAXII 2.1 defines three services: Discovery (find available API roots), API Root (entry point for collections), and Collections (repositories of CTI objects). Collections support two access models: the Collection endpoint allows consumers to poll for objects, and the Status endpoint tracks the result of add operations. TAXII uses HTTP content negotiation with `application\u002Ftaxii+json;version=2.1`.\n\n### Sharing Models\n\nTAXII supports hub-and-spoke (central server distributes to consumers), peer-to-peer (bidirectional sharing between partners), and source-subscriber (producer publishes, consumers subscribe) models. Each collection can have read-only, write-only, or read-write access controls.\n\n### STIX 2.1 Content\n\nTAXII transports STIX 2.1 bundles containing Structured Threat Information objects: Indicators (detection patterns), Observed Data, Malware, Attack Patterns, Threat Actors, Intrusion Sets, Campaigns, Relationships, and Sightings. Each object has a unique STIX ID, creation\u002Fmodification timestamps, and optional TLP marking definitions.\n\n## Workflow\n\n### Step 1: Deploy TAXII 2.1 Server with Medallion\n\n```python\n# Install medallion (OASIS reference implementation)\n# pip install medallion\n\n# medallion_config.json\nimport json\n\nconfig = {\n    \"backend\": {\n        \"module_class\": \"MemoryBackend\",\n        \"filename\": \"taxii_data.json\"\n    },\n    \"users\": {\n        \"admin\": \"admin_password_change_me\",\n        \"analyst\": \"analyst_password_change_me\",\n        \"readonly\": \"readonly_password_change_me\"\n    },\n    \"taxii\": {\n        \"max_content_length\": 10485760\n    }\n}\n\n# Create initial data store\ntaxii_data = {\n    \"discovery\": {\n        \"title\": \"Threat Intelligence TAXII Server\",\n        \"description\": \"TAXII 2.1 server for sharing CTI indicators\",\n        \"contact\": \"soc@organization.com\",\n        \"default\": \"https:\u002F\u002Ftaxii.organization.com\u002Fapi\u002F\",\n        \"api_roots\": [\"https:\u002F\u002Ftaxii.organization.com\u002Fapi\u002F\"]\n    },\n    \"api_roots\": {\n        \"api\": {\n            \"title\": \"Threat Intelligence API Root\",\n            \"description\": \"Primary API root for threat intelligence sharing\",\n            \"versions\": [\"application\u002Ftaxii+json;version=2.1\"],\n            \"max_content_length\": 10485760,\n            \"collections\": {\n                \"malware-iocs\": {\n                    \"id\": \"91a7b528-80eb-42ed-a74d-c6fbd5a26116\",\n                    \"title\": \"Malware IOCs\",\n                    \"description\": \"Indicators of compromise from malware analysis\",\n                    \"can_read\": True,\n                    \"can_write\": True,\n                    \"media_types\": [\"application\u002Fstix+json;version=2.1\"]\n                },\n                \"apt-intelligence\": {\n                    \"id\": \"52892447-4d7e-4f70-b94a-5460e242dd23\",\n                    \"title\": \"APT Intelligence\",\n                    \"description\": \"Advanced persistent threat group intelligence\",\n                    \"can_read\": True,\n                    \"can_write\": True,\n                    \"media_types\": [\"application\u002Fstix+json;version=2.1\"]\n                },\n                \"phishing-indicators\": {\n                    \"id\": \"64993447-4d7e-4f70-b94a-5460e242ee34\",\n                    \"title\": \"Phishing Indicators\",\n                    \"description\": \"Phishing URLs, domains, and email indicators\",\n                    \"can_read\": True,\n                    \"can_write\": True,\n                    \"media_types\": [\"application\u002Fstix+json;version=2.1\"]\n                }\n            }\n        }\n    }\n}\n\nwith open(\"medallion_config.json\", \"w\") as f:\n    json.dump(config, f, indent=2)\nwith open(\"taxii_data.json\", \"w\") as f:\n    json.dump(taxii_data, f, indent=2)\nprint(\"[+] TAXII server configuration created\")\n```\n\n### Step 2: Docker Deployment\n\n```yaml\n# docker-compose.yml\nversion: '3.8'\nservices:\n  taxii-server:\n    image: python:3.11-slim\n    container_name: taxii-server\n    working_dir: \u002Fapp\n    volumes:\n      - .\u002Fmedallion_config.json:\u002Fapp\u002Fmedallion_config.json\n      - .\u002Ftaxii_data.json:\u002Fapp\u002Ftaxii_data.json\n      - .\u002Fcerts:\u002Fapp\u002Fcerts\n    ports:\n      - \"6100:6100\"\n    command: >\n      bash -c \"pip install medallion &&\n      medallion --host 0.0.0.0 --port 6100\n      --config \u002Fapp\u002Fmedallion_config.json\"\n    restart: unless-stopped\n    healthcheck:\n      test: [\"CMD\", \"curl\", \"-f\", \"http:\u002F\u002Flocalhost:6100\u002Ftaxii2\u002F\"]\n      interval: 30s\n      timeout: 10s\n      retries: 3\n```\n\n### Step 3: Publish STIX 2.1 Objects to Collections\n\n```python\nfrom stix2 import Indicator, Malware, Relationship, Bundle, TLP_WHITE\nfrom taxii2client.v21 import Server, Collection, as_pages\nimport json\nfrom datetime import datetime\n\nclass TAXIIPublisher:\n    def __init__(self, server_url, username, password):\n        self.server = Server(\n            server_url,\n            user=username,\n            password=password,\n        )\n\n    def list_collections(self):\n        \"\"\"List all available collections.\"\"\"\n        api_root = self.server.api_roots[0]\n        for collection in api_root.collections:\n            print(f\"  [{collection.id}] {collection.title} \"\n                  f\"(read={collection.can_read}, write={collection.can_write})\")\n        return api_root.collections\n\n    def publish_indicators(self, collection_id, indicators):\n        \"\"\"Publish STIX indicators to a TAXII collection.\"\"\"\n        api_root = self.server.api_roots[0]\n        collection = Collection(\n            f\"{api_root.url}collections\u002F{collection_id}\u002F\",\n            user=self.server._user,\n            password=self.server._password,\n        )\n        bundle = Bundle(objects=indicators)\n        response = collection.add_objects(bundle.serialize())\n        print(f\"[+] Published {len(indicators)} objects to {collection_id}\")\n        print(f\"    Status: {response.status}\")\n        return response\n\n    def create_malware_indicators(self):\n        \"\"\"Create sample STIX malware indicators.\"\"\"\n        malware = Malware(\n            name=\"SUNBURST\",\n            description=\"Backdoor used in SolarWinds supply chain attack (2020). \"\n                        \"Trojanized SolarWinds.Orion.Core.BusinessLayer.dll module.\",\n            malware_types=[\"backdoor\", \"trojan\"],\n            is_family=True,\n            object_marking_refs=[TLP_WHITE],\n        )\n\n        indicator_hash = Indicator(\n            name=\"SUNBURST SHA-256 Hash\",\n            description=\"SHA-256 hash of trojanized SolarWinds Orion DLL\",\n            pattern=\"[file:hashes.'SHA-256' = \"\n                    \"'32519b85c0b422e4656de6e6c41878e95fd95026267daab4215ee59c107d6c77']\",\n            pattern_type=\"stix\",\n            valid_from=datetime(2020, 12, 13),\n            indicator_types=[\"malicious-activity\"],\n            object_marking_refs=[TLP_WHITE],\n        )\n\n        indicator_domain = Indicator(\n            name=\"SUNBURST C2 Domain Pattern\",\n            description=\"DGA domain pattern used by SUNBURST for C2\",\n            pattern=\"[domain-name:value MATCHES \"\n                    \"'^[a-z0-9]{4,}\\\\.appsync-api\\\\..*\\\\.avsvmcloud\\\\.com$']\",\n            pattern_type=\"stix\",\n            valid_from=datetime(2020, 12, 13),\n            indicator_types=[\"malicious-activity\"],\n            object_marking_refs=[TLP_WHITE],\n        )\n\n        rel = Relationship(\n            relationship_type=\"indicates\",\n            source_ref=indicator_hash.id,\n            target_ref=malware.id,\n        )\n\n        return [malware, indicator_hash, indicator_domain, rel]\n\npublisher = TAXIIPublisher(\n    \"https:\u002F\u002Ftaxii.organization.com\u002Ftaxii2\u002F\",\n    \"admin\", \"admin_password_change_me\"\n)\ncollections = publisher.list_collections()\nindicators = publisher.create_malware_indicators()\npublisher.publish_indicators(\"91a7b528-80eb-42ed-a74d-c6fbd5a26116\", indicators)\n```\n\n### Step 4: Consume Intelligence from TAXII Collections\n\n```python\nfrom taxii2client.v21 import Server, Collection, as_pages\nimport json\n\nclass TAXIIConsumer:\n    def __init__(self, server_url, username, password):\n        self.server = Server(server_url, user=username, password=password)\n\n    def poll_collection(self, collection_id, added_after=None):\n        \"\"\"Poll a collection for new STIX objects.\"\"\"\n        api_root = self.server.api_roots[0]\n        collection = Collection(\n            f\"{api_root.url}collections\u002F{collection_id}\u002F\",\n            user=self.server._user,\n            password=self.server._password,\n        )\n\n        kwargs = {}\n        if added_after:\n            kwargs[\"added_after\"] = added_after\n\n        all_objects = []\n        for bundle in as_pages(collection.get_objects, per_request=50, **kwargs):\n            objects = json.loads(bundle).get(\"objects\", [])\n            all_objects.extend(objects)\n\n        indicators = [o for o in all_objects if o.get(\"type\") == \"indicator\"]\n        malware = [o for o in all_objects if o.get(\"type\") == \"malware\"]\n        relationships = [o for o in all_objects if o.get(\"type\") == \"relationship\"]\n\n        print(f\"[+] Polled {len(all_objects)} objects: \"\n              f\"{len(indicators)} indicators, {len(malware)} malware, \"\n              f\"{len(relationships)} relationships\")\n        return all_objects\n\n    def extract_iocs_for_siem(self, stix_objects):\n        \"\"\"Extract IOCs from STIX objects for SIEM ingestion.\"\"\"\n        iocs = []\n        for obj in stix_objects:\n            if obj.get(\"type\") == \"indicator\":\n                pattern = obj.get(\"pattern\", \"\")\n                iocs.append({\n                    \"id\": obj.get(\"id\"),\n                    \"name\": obj.get(\"name\", \"\"),\n                    \"pattern\": pattern,\n                    \"valid_from\": obj.get(\"valid_from\", \"\"),\n                    \"indicator_types\": obj.get(\"indicator_types\", []),\n                    \"confidence\": obj.get(\"confidence\", 0),\n                })\n        return iocs\n\nconsumer = TAXIIConsumer(\n    \"https:\u002F\u002Ftaxii.organization.com\u002Ftaxii2\u002F\",\n    \"analyst\", \"analyst_password_change_me\"\n)\nobjects = consumer.poll_collection(\"91a7b528-80eb-42ed-a74d-c6fbd5a26116\")\niocs = consumer.extract_iocs_for_siem(objects)\n```\n\n### Step 5: Integrate with SIEM\u002FSOAR\n\n```python\nimport requests\n\ndef push_to_splunk(iocs, splunk_url, hec_token):\n    \"\"\"Push extracted IOCs to Splunk via HEC.\"\"\"\n    headers = {\"Authorization\": f\"Splunk {hec_token}\"}\n    for ioc in iocs:\n        event = {\n            \"event\": ioc,\n            \"sourcetype\": \"stix:indicator\",\n            \"source\": \"taxii-server\",\n            \"index\": \"threat_intel\",\n        }\n        resp = requests.post(\n            f\"{splunk_url}\u002Fservices\u002Fcollector\u002Fevent\",\n            headers=headers,\n            json=event,\n            verify=not os.environ.get(\"SKIP_TLS_VERIFY\", \"\").lower() == \"true\",  # Set SKIP_TLS_VERIFY=true for self-signed certs in lab environments\n        )\n        if resp.status_code != 200:\n            print(f\"[-] Splunk HEC error: {resp.text}\")\n    print(f\"[+] Pushed {len(iocs)} IOCs to Splunk\")\n\ndef push_to_elasticsearch(iocs, es_url, index=\"threat-intel\"):\n    \"\"\"Push IOCs to Elasticsearch.\"\"\"\n    for ioc in iocs:\n        resp = requests.post(\n            f\"{es_url}\u002F{index}\u002F_doc\",\n            json=ioc,\n            headers={\"Content-Type\": \"application\u002Fjson\"},\n        )\n        if resp.status_code not in (200, 201):\n            print(f\"[-] ES error: {resp.text}\")\n    print(f\"[+] Indexed {len(iocs)} IOCs in Elasticsearch\")\n```\n\n## Validation Criteria\n\n- TAXII 2.1 server deployed and accessible via HTTPS\n- Collections created with appropriate read\u002Fwrite permissions\n- STIX 2.1 bundles published successfully to collections\n- Consumer can poll and retrieve objects with filtering\n- IOCs extracted and forwarded to SIEM platform\n- Authentication and authorization enforced correctly\n\n## References\n\n- [TAXII 2.1 Specification](https:\u002F\u002Fdocs.oasis-open.org\u002Fcti\u002Ftaxii\u002Fv2.1\u002Fos\u002Ftaxii-v2.1-os.html)\n- [OASIS CTI Documentation](https:\u002F\u002Foasis-open.github.io\u002Fcti-documentation\u002F)\n- [EclecticIQ OpenTAXII](https:\u002F\u002Fwww.eclecticiq.com\u002Fopen-source)\n- [cti-taxii-server (Medallion)](https:\u002F\u002Fgithub.com\u002Foasis-open\u002Fcti-taxii-server)\n- [taxii2-client Python Library](https:\u002F\u002Fgithub.com\u002Foasis-open\u002Fcti-taxii-client)\n- [Kraven Security: STIX\u002FTAXII Complete Guide](https:\u002F\u002Fkravensecurity.com\u002Fstix-and-taxii-a-full-guide\u002F)\n","# Implementing TAXII Server with OpenTAXII\n\n## Overview\n\nTAXII (Trusted Automated eXchange of Intelligence Information) is an OASIS standard protocol for exchanging cyber threat intelligence over HTTPS. OpenTAXII is an open-source TAXII server implementation by EclecticIQ that supports TAXII 1.x, while the OASIS cti-taxii-server provides a TAXII 2.1 reference implementation. This skill covers deploying a TAXII server, configuring collections for threat intelligence feeds, publishing STIX 2.1 bundles, and integrating with SIEM\u002FSOAR platforms for automated indicator ingestion.\n\n\n## When to Use\n\n- When deploying or configuring implementing taxii server with opentaxii capabilities in your environment\n- When establishing security controls aligned to compliance requirements\n- When building or improving security architecture for this domain\n- When conducting security assessments that require this implementation\n\n## Prerequisites\n\n- Python 3.9+ with `medallion`, `stix2`, `taxii2-client`, `opentaxii`, `cabby` libraries\n- Docker and Docker Compose for containerized deployment\n- Understanding of STIX 2.1 objects (Indicator, Malware, Attack Pattern, Relationship)\n- Familiarity with REST APIs and HTTPS configuration\n- TLS certificates for production deployment\n\n## Key Concepts\n\n### TAXII 2.1 Architecture\n\nTAXII 2.1 defines three services: Discovery (find available API roots), API Root (entry point for collections), and Collections (repositories of CTI objects). Collections support two access models: the Collection endpoint allows consumers to poll for objects, and the Status endpoint tracks the result of add operations. TAXII uses HTTP content negotiation with `application\u002Ftaxii+json;version=2.1`.\n\n### Sharing Models\n\nTAXII supports hub-and-spoke (central server distributes to consumers), peer-to-peer (bidirectional sharing between partners), and source-subscriber (producer publishes, consumers subscribe) models. Each collection can have read-only, write-only, or read-write access controls.\n\n### STIX 2.1 Content\n\nTAXII transports STIX 2.1 bundles containing Structured Threat Information objects: Indicators (detection patterns), Observed Data, Malware, Attack Patterns, Threat Actors, Intrusion Sets, Campaigns, Relationships, and Sightings. Each object has a unique STIX ID, creation\u002Fmodification timestamps, and optional TLP marking definitions.\n\n## Workflow\n\n### Step 1: Deploy TAXII 2.1 Server with Medallion\n\n```python\n# Install medallion (OASIS reference implementation)\n# pip install medallion\n\n# medallion_config.json\nimport json\n\nconfig = {\n    \"backend\": {\n        \"module_class\": \"MemoryBackend\",\n        \"filename\": \"taxii_data.json\"\n    },\n    \"users\": {\n        \"admin\": \"admin_password_change_me\",\n        \"analyst\": \"analyst_password_change_me\",\n        \"readonly\": \"readonly_password_change_me\"\n    },\n    \"taxii\": {\n        \"max_content_length\": 10485760\n    }\n}\n\n# Create initial data store\ntaxii_data = {\n    \"discovery\": {\n        \"title\": \"Threat Intelligence TAXII Server\",\n        \"description\": \"TAXII 2.1 server for sharing CTI indicators\",\n        \"contact\": \"soc@organization.com\",\n        \"default\": \"https:\u002F\u002Ftaxii.organization.com\u002Fapi\u002F\",\n        \"api_roots\": [\"https:\u002F\u002Ftaxii.organization.com\u002Fapi\u002F\"]\n    },\n    \"api_roots\": {\n        \"api\": {\n            \"title\": \"Threat Intelligence API Root\",\n            \"description\": \"Primary API root for threat intelligence sharing\",\n            \"versions\": [\"application\u002Ftaxii+json;version=2.1\"],\n            \"max_content_length\": 10485760,\n            \"collections\": {\n                \"malware-iocs\": {\n                    \"id\": \"91a7b528-80eb-42ed-a74d-c6fbd5a26116\",\n                    \"title\": \"Malware IOCs\",\n                    \"description\": \"Indicators of compromise from malware analysis\",\n                    \"can_read\": True,\n                    \"can_write\": True,\n                    \"media_types\": [\"application\u002Fstix+json;version=2.1\"]\n                },\n                \"apt-intelligence\": {\n                    \"id\": \"52892447-4d7e-4f70-b94a-5460e242dd23\",\n                    \"title\": \"APT Intelligence\",\n                    \"description\": \"Advanced persistent threat group intelligence\",\n                    \"can_read\": True,\n                    \"can_write\": True,\n                    \"media_types\": [\"application\u002Fstix+json;version=2.1\"]\n                },\n                \"phishing-indicators\": {\n                    \"id\": \"64993447-4d7e-4f70-b94a-5460e242ee34\",\n                    \"title\": \"Phishing Indicators\",\n                    \"description\": \"Phishing URLs, domains, and email indicators\",\n                    \"can_read\": True,\n                    \"can_write\": True,\n                    \"media_types\": [\"application\u002Fstix+json;version=2.1\"]\n                }\n            }\n        }\n    }\n}\n\nwith open(\"medallion_config.json\", \"w\") as f:\n    json.dump(config, f, indent=2)\nwith open(\"taxii_data.json\", \"w\") as f:\n    json.dump(taxii_data, f, indent=2)\nprint(\"[+] TAXII server configuration created\")\n```\n\n### Step 2: Docker Deployment\n\n```yaml\n# docker-compose.yml\nversion: '3.8'\nservices:\n  taxii-server:\n    image: python:3.11-slim\n    container_name: taxii-server\n    working_dir: \u002Fapp\n    volumes:\n      - .\u002Fmedallion_config.json:\u002Fapp\u002Fmedallion_config.json\n      - .\u002Ftaxii_data.json:\u002Fapp\u002Ftaxii_data.json\n      - .\u002Fcerts:\u002Fapp\u002Fcerts\n    ports:\n      - \"6100:6100\"\n    command: >\n      bash -c \"pip install medallion &&\n      medallion --host 0.0.0.0 --port 6100\n      --config \u002Fapp\u002Fmedallion_config.json\"\n    restart: unless-stopped\n    healthcheck:\n      test: [\"CMD\", \"curl\", \"-f\", \"http:\u002F\u002Flocalhost:6100\u002Ftaxii2\u002F\"]\n      interval: 30s\n      timeout: 10s\n      retries: 3\n```\n\n### Step 3: Publish STIX 2.1 Objects to Collections\n\n```python\nfrom stix2 import Indicator, Malware, Relationship, Bundle, TLP_WHITE\nfrom taxii2client.v21 import Server, Collection, as_pages\nimport json\nfrom datetime import datetime\n\nclass TAXIIPublisher:\n    def __init__(self, server_url, username, password):\n        self.server = Server(\n            server_url,\n            user=username,\n            password=password,\n        )\n\n    def list_collections(self):\n        \"\"\"List all available collections.\"\"\"\n        api_root = self.server.api_roots[0]\n        for collection in api_root.collections:\n            print(f\"  [{collection.id}] {collection.title} \"\n                  f\"(read={collection.can_read}, write={collection.can_write})\")\n        return api_root.collections\n\n    def publish_indicators(self, collection_id, indicators):\n        \"\"\"Publish STIX indicators to a TAXII collection.\"\"\"\n        api_root = self.server.api_roots[0]\n        collection = Collection(\n            f\"{api_root.url}collections\u002F{collection_id}\u002F\",\n            user=self.server._user,\n            password=self.server._password,\n        )\n        bundle = Bundle(objects=indicators)\n        response = collection.add_objects(bundle.serialize())\n        print(f\"[+] Published {len(indicators)} objects to {collection_id}\")\n        print(f\"    Status: {response.status}\")\n        return response\n\n    def create_malware_indicators(self):\n        \"\"\"Create sample STIX malware indicators.\"\"\"\n        malware = Malware(\n            name=\"SUNBURST\",\n            description=\"Backdoor used in SolarWinds supply chain attack (2020). \"\n                        \"Trojanized SolarWinds.Orion.Core.BusinessLayer.dll module.\",\n            malware_types=[\"backdoor\", \"trojan\"],\n            is_family=True,\n            object_marking_refs=[TLP_WHITE],\n        )\n\n        indicator_hash = Indicator(\n            name=\"SUNBURST SHA-256 Hash\",\n            description=\"SHA-256 hash of trojanized SolarWinds Orion DLL\",\n            pattern=\"[file:hashes.'SHA-256' = \"\n                    \"'32519b85c0b422e4656de6e6c41878e95fd95026267daab4215ee59c107d6c77']\",\n            pattern_type=\"stix\",\n            valid_from=datetime(2020, 12, 13),\n            indicator_types=[\"malicious-activity\"],\n            object_marking_refs=[TLP_WHITE],\n        )\n\n        indicator_domain = Indicator(\n            name=\"SUNBURST C2 Domain Pattern\",\n            description=\"DGA domain pattern used by SUNBURST for C2\",\n            pattern=\"[domain-name:value MATCHES \"\n                    \"'^[a-z0-9]{4,}\\\\.appsync-api\\\\..*\\\\.avsvmcloud\\\\.com$']\",\n            pattern_type=\"stix\",\n            valid_from=datetime(2020, 12, 13),\n            indicator_types=[\"malicious-activity\"],\n            object_marking_refs=[TLP_WHITE],\n        )\n\n        rel = Relationship(\n            relationship_type=\"indicates\",\n            source_ref=indicator_hash.id,\n            target_ref=malware.id,\n        )\n\n        return [malware, indicator_hash, indicator_domain, rel]\n\npublisher = TAXIIPublisher(\n    \"https:\u002F\u002Ftaxii.organization.com\u002Ftaxii2\u002F\",\n    \"admin\", \"admin_password_change_me\"\n)\ncollections = publisher.list_collections()\nindicators = publisher.create_malware_indicators()\npublisher.publish_indicators(\"91a7b528-80eb-42ed-a74d-c6fbd5a26116\", indicators)\n```\n\n### Step 4: Consume Intelligence from TAXII Collections\n\n```python\nfrom taxii2client.v21 import Server, Collection, as_pages\nimport json\n\nclass TAXIIConsumer:\n    def __init__(self, server_url, username, password):\n        self.server = Server(server_url, user=username, password=password)\n\n    def poll_collection(self, collection_id, added_after=None):\n        \"\"\"Poll a collection for new STIX objects.\"\"\"\n        api_root = self.server.api_roots[0]\n        collection = Collection(\n            f\"{api_root.url}collections\u002F{collection_id}\u002F\",\n            user=self.server._user,\n            password=self.server._password,\n        )\n\n        kwargs = {}\n        if added_after:\n            kwargs[\"added_after\"] = added_after\n\n        all_objects = []\n        for bundle in as_pages(collection.get_objects, per_request=50, **kwargs):\n            objects = json.loads(bundle).get(\"objects\", [])\n            all_objects.extend(objects)\n\n        indicators = [o for o in all_objects if o.get(\"type\") == \"indicator\"]\n        malware = [o for o in all_objects if o.get(\"type\") == \"malware\"]\n        relationships = [o for o in all_objects if o.get(\"type\") == \"relationship\"]\n\n        print(f\"[+] Polled {len(all_objects)} objects: \"\n              f\"{len(indicators)} indicators, {len(malware)} malware, \"\n              f\"{len(relationships)} relationships\")\n        return all_objects\n\n    def extract_iocs_for_siem(self, stix_objects):\n        \"\"\"Extract IOCs from STIX objects for SIEM ingestion.\"\"\"\n        iocs = []\n        for obj in stix_objects:\n            if obj.get(\"type\") == \"indicator\":\n                pattern = obj.get(\"pattern\", \"\")\n                iocs.append({\n                    \"id\": obj.get(\"id\"),\n                    \"name\": obj.get(\"name\", \"\"),\n                    \"pattern\": pattern,\n                    \"valid_from\": obj.get(\"valid_from\", \"\"),\n                    \"indicator_types\": obj.get(\"indicator_types\", []),\n                    \"confidence\": obj.get(\"confidence\", 0),\n                })\n        return iocs\n\nconsumer = TAXIIConsumer(\n    \"https:\u002F\u002Ftaxii.organization.com\u002Ftaxii2\u002F\",\n    \"analyst\", \"analyst_password_change_me\"\n)\nobjects = consumer.poll_collection(\"91a7b528-80eb-42ed-a74d-c6fbd5a26116\")\niocs = consumer.extract_iocs_for_siem(objects)\n```\n\n### Step 5: Integrate with SIEM\u002FSOAR\n\n```python\nimport requests\n\ndef push_to_splunk(iocs, splunk_url, hec_token):\n    \"\"\"Push extracted IOCs to Splunk via HEC.\"\"\"\n    headers = {\"Authorization\": f\"Splunk {hec_token}\"}\n    for ioc in iocs:\n        event = {\n            \"event\": ioc,\n            \"sourcetype\": \"stix:indicator\",\n            \"source\": \"taxii-server\",\n            \"index\": \"threat_intel\",\n        }\n        resp = requests.post(\n            f\"{splunk_url}\u002Fservices\u002Fcollector\u002Fevent\",\n            headers=headers,\n            json=event,\n            verify=not os.environ.get(\"SKIP_TLS_VERIFY\", \"\").lower() == \"true\",  # Set SKIP_TLS_VERIFY=true for self-signed certs in lab environments\n        )\n        if resp.status_code != 200:\n            print(f\"[-] Splunk HEC error: {resp.text}\")\n    print(f\"[+] Pushed {len(iocs)} IOCs to Splunk\")\n\ndef push_to_elasticsearch(iocs, es_url, index=\"threat-intel\"):\n    \"\"\"Push IOCs to Elasticsearch.\"\"\"\n    for ioc in iocs:\n        resp = requests.post(\n            f\"{es_url}\u002F{index}\u002F_doc\",\n            json=ioc,\n            headers={\"Content-Type\": \"application\u002Fjson\"},\n        )\n        if resp.status_code not in (200, 201):\n            print(f\"[-] ES error: {resp.text}\")\n    print(f\"[+] Indexed {len(iocs)} IOCs in Elasticsearch\")\n```\n\n## Validation Criteria\n\n- TAXII 2.1 server deployed and accessible via HTTPS\n- Collections created with appropriate read\u002Fwrite permissions\n- STIX 2.1 bundles published successfully to collections\n- Consumer can poll and retrieve objects with filtering\n- IOCs extracted and forwarded to SIEM platform\n- Authentication and authorization enforced correctly\n\n## References\n\n- [TAXII 2.1 Specification](https:\u002F\u002Fdocs.oasis-open.org\u002Fcti\u002Ftaxii\u002Fv2.1\u002Fos\u002Ftaxii-v2.1-os.html)\n- [OASIS CTI Documentation](https:\u002F\u002Foasis-open.github.io\u002Fcti-documentation\u002F)\n- [EclecticIQ OpenTAXII](https:\u002F\u002Fwww.eclecticiq.com\u002Fopen-source)\n- [cti-taxii-server (Medallion)](https:\u002F\u002Fgithub.com\u002Foasis-open\u002Fcti-taxii-server)\n- [taxii2-client Python Library](https:\u002F\u002Fgithub.com\u002Foasis-open\u002Fcti-taxii-client)\n- [Kraven Security: STIX\u002FTAXII Complete Guide](https:\u002F\u002Fkravensecurity.com\u002Fstix-and-taxii-a-full-guide\u002F)\n",{"name":5,"tags":55,"author":57,"domain":49,"license":15,"version":58,"nist_csf":59,"subdomain":43,"description":7,"mitre_attack":64},[56,33,36,39,42,35,34,46],"taxii","mahipal","1.0",[60,61,62,63],"ID.RA-01","ID.RA-05","DE.CM-01","DE.AE-02",[65,66,67,68],"T1591","T1592","T1593","T1589","main","54a798831d2266a3ca61ce68a7acb80b81160d57","skills\u002Fimplementing-taxii-server-with-opentaxii",4395,"https:\u002F\u002Fgithub.com\u002Fmukul975\u002FAnthropic-Cybersecurity-Skills","https:\u002F\u002Fmahipal.engineer\u002FAnthropic-Cybersecurity-Skills\u002F","https:\u002F\u002Fgithub.com\u002Fmukul975","Mahipal.engineer","🔐 Cybersecurity | 💻 Dev | 📷 Street Photographer\r\n🎓 MSc | 📚 Research & AI Security","2026-08-31 12:32:44",{"source":8,"skillName":5,"commands":80,"prompt":90,"zipAvailable":91},[81,84,87],{"tool":82,"command":83},"npx","npx skills add mukul975\u002FAnthropic-Cybersecurity-Skills --skill implementing-taxii-server-with-opentaxii",{"tool":85,"command":86},"bunx","bunx skills add mukul975\u002FAnthropic-Cybersecurity-Skills --skill implementing-taxii-server-with-opentaxii",{"tool":88,"command":89},"pnpm","pnpm dlx skills add mukul975\u002FAnthropic-Cybersecurity-Skills --skill implementing-taxii-server-with-opentaxii","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmukul975\u002FAnthropic-Cybersecurity-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fimplementing-taxii-server-with-opentaxii\u002FSKILL.md",true,[93,98,104],{"path":94,"resourceType":94,"resourceTypeDesc":95,"sizeBytes":96,"sourceHtmlUrl":97},"LICENSE","许可证",11255,"https:\u002F\u002Fgithub.com\u002Fmukul975\u002FAnthropic-Cybersecurity-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fimplementing-taxii-server-with-opentaxii\u002FLICENSE",{"path":99,"resourceType":100,"resourceTypeDesc":101,"sizeBytes":102,"sourceHtmlUrl":103},"references\u002Fapi-reference.md","REFERENCE","参考文档",4332,"https:\u002F\u002Fgithub.com\u002Fmukul975\u002FAnthropic-Cybersecurity-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fimplementing-taxii-server-with-opentaxii\u002Freferences\u002Fapi-reference.md",{"path":105,"resourceType":106,"resourceTypeDesc":107,"sizeBytes":108,"sourceHtmlUrl":109},"scripts\u002Fagent.py","SCRIPT","脚本",8729,"https:\u002F\u002Fgithub.com\u002Fmukul975\u002FAnthropic-Cybersecurity-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fimplementing-taxii-server-with-opentaxii\u002Fscripts\u002Fagent.py",[111,138,162,190,216,243],{"skillNo":112,"name":113,"nameZh":6,"description":114,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":115,"categories":116,"keywords":118,"publishedAt":50},"01M6AGDM3HJXTKXX15ZZ0ZVCJ3","verifying-build-provenance-with-slsa-sigstore","Verifies artifact signatures and SLSA provenance using Sigstore's cosign (verify, verify-attestation, verify-blob-attestation) and slsa-verifier (verify-artifact), enforcing keyless OIDC builder identity and source repo against SLSA Build levels. Use in CI\u002FCD before deploying artifacts, when consuming third-party attestations, establishing a SLSA Build L3 pipeline, or confirming provenance during incident response or admission control.","https:\u002F\u002Fgithub.com\u002Fmukul975\u002FAnthropic-Cybersecurity-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fverifying-build-provenance-with-slsa-sigstore\u002FSKILL.md",[117],{"categoryNo":27,"categoryName":28,"taxonomyType":21,"taxonomyTypeDesc":22},[119,120,121,122,123,49,124,125,126,127,128,129,130,131,132,133,134,135,136,137],"sigstore","provenance","slsa","verifying build provenance with slsa sigstore","security","incident response","identity","pr","code","artifacts","ci","supply-chain","pipeline","supply-chain-security","t1195","attestation","code-signing","cosign","keyless",{"skillNo":139,"name":140,"nameZh":6,"description":141,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":142,"categories":143,"keywords":145,"publishedAt":50},"01M6AGDGBPWYVZ2F11GFKJ4HZ9","validating-tpm-measured-boot-attestation","Verifies TPM 2.0 measured-boot integrity and remote attestation with tpm2-tools -- reading PCRs (tpm2_pcrread), replaying the boot event log, generating and checking signed quotes (tpm2_quote\u002Ftpm2_checkquote), and sealing secrets to a PCR policy. Use to confirm a system booted trusted firmware\u002Fkernel for Zero Trust device posture, detect boot-chain tampering via PCR drift, or build a golden-value baseline for fleet attestation.","https:\u002F\u002Fgithub.com\u002Fmukul975\u002FAnthropic-Cybersecurity-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fvalidating-tpm-measured-boot-attestation\u002FSKILL.md",[144],{"categoryNo":27,"categoryName":28,"taxonomyType":21,"taxonomyTypeDesc":22},[146,134,147,148,123,149,49,126,150,151,152,153,154,155,156,157,158,159,160,161],"boot","TPM","validating tpm measured boot attestation","policy","verification","ZeRO","firmware","Tools","measured-boot","PCR","integrity","secrets","remote-attestation","tpm2-tools","integrity-verification","trusted-computing",{"skillNo":163,"name":164,"nameZh":6,"description":165,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":166,"categories":167,"keywords":172,"publishedAt":50},"01M6AGDCW0Y4FXZ3362GT1941M","validating-backup-integrity-for-recovery","Validates backup integrity through cryptographic hash verification, automated restore testing, corruption detection, and recoverability checks to confirm backups are reliable for disaster recovery and ransomware response. Use before relying on backups for recovery, when building post-backup validation pipelines, auditing backup infrastructure for compliance, or checking immutable\u002Fair-gapped backups for silent corruption or tampering.","https:\u002F\u002Fgithub.com\u002Fmukul975\u002FAnthropic-Cybersecurity-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fvalidating-backup-integrity-for-recovery\u002FSKILL.md",[168,171],{"categoryNo":169,"categoryName":170,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":27,"categoryName":28,"taxonomyType":21,"taxonomyTypeDesc":22},[156,173,174,175,176,49,177,178,150,179,180,181,182,183,184,185,186,187,188,189],"backup","recovery","validating backup integrity for recovery","testing","infrastructure","validation","compliance","hash-verification","incident-response","ransomware","cryptocurrency","detection","t1078","t1490","immutable","disaster-recovery","restore-testing",{"skillNo":191,"name":192,"nameZh":6,"description":193,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":194,"categories":195,"keywords":197,"publishedAt":50},"01M6AGD9GBG2KZ336AE763J3WH","triaging-windows-with-kape","Runs KAPE (Kroll Artifact Parser and Extractor) to collect targeted forensic artifacts (registry hives, $MFT, event logs, prefetch, browser data) via Targets and parse them with Modules wrapping Eric Zimmerman's EZ Tools (PECmd, MFTECmd, RECmd). Use during early incident containment\u002Ftriage when full disk imaging is impractical but a defensible, parseable Windows artifact set is needed quickly, including at-scale remote collection.","https:\u002F\u002Fgithub.com\u002Fmukul975\u002FAnthropic-Cybersecurity-Skills\u002Fblob\u002Fmain\u002Fskills\u002Ftriaging-windows-with-kape\u002FSKILL.md",[196],{"categoryNo":27,"categoryName":28,"taxonomyType":21,"taxonomyTypeDesc":22},[198,199,200,49,201,202,203,204,205,206,207,208,209,210,211,212,153,213,214,215],"windows","kape","triaging windows with kape","registry","browser","logs","windows-forensics","dfir","mft","mftecmd","data","prefetch","eric-zimmerman","digital-forensics","SET","collection","pecmd","artifact-collection",{"skillNo":217,"name":218,"nameZh":6,"description":219,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":220,"categories":221,"keywords":223,"publishedAt":50},"01M6AGD5PW5J4EVZM958WD74ZQ","triaging-vulnerabilities-with-ssvc-framework","Triages and prioritizes vulnerabilities with CISA's Stakeholder-Specific Vulnerability Categorization (SSVC) decision tree, weighing exploitation status (via the CISA KEV catalog and FIRST EPSS API), technical impact, automatability, and mission prevalence to output Track\u002FTrack*\u002FAttend\u002FAct decisions. Use when prioritizing vulnerability scan results (OpenVAS, Nessus, Qualys) for remediation planning beyond raw CVSS scores.","https:\u002F\u002Fgithub.com\u002Fmukul975\u002FAnthropic-Cybersecurity-Skills\u002Fblob\u002Fmain\u002Fskills\u002Ftriaging-vulnerabilities-with-ssvc-framework\u002FSKILL.md",[222],{"categoryNo":27,"categoryName":28,"taxonomyType":21,"taxonomyTypeDesc":22},[224,225,226,49,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242],"vulnerabilities","framework","triaging vulnerabilities with ssvc framework","status","planning","CISA","vulnerability-management","risk-management","nessus","qualys","openvas","cvss","remediation","risk","vulnerability","api","prioritization","ssvc","decision-tree",{"skillNo":244,"name":245,"nameZh":6,"description":246,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":247,"categories":248,"keywords":250,"publishedAt":50},"01M6AGD24TTQQM4CXG69E3B9TJ","triaging-security-incident","Performs initial triage of security incidents using the NIST SP 800-61r3 and SANS PICERL frameworks, classifying incident type, assigning priority by business impact, and routing to the appropriate response team. Use when a SIEM\u002FEDR alert needs human classification, concurrent alerts must be prioritized, or a user report or threat-intel IOC match requires initial incident categorization.","https:\u002F\u002Fgithub.com\u002Fmukul975\u002FAnthropic-Cybersecurity-Skills\u002Fblob\u002Fmain\u002Fskills\u002Ftriaging-security-incident\u002FSKILL.md",[249],{"categoryNo":27,"categoryName":28,"taxonomyType":21,"taxonomyTypeDesc":22},[123,251,49,48,252,253,254,255,256,257,258,185,259,186,260,261,262,263,264,265],"triaging security incident","file","ioc","soc","NIST-800-61","NIST","severity","edr","execution","analysis","classification","severity-classification","incident-triage","SANS-PICERL","SOC-operations"]