{"id":40945062,"url":"https://github.com/happystoic/iris","last_synced_at":"2026-01-22T04:39:38.027Z","repository":{"id":223892128,"uuid":"440805753","full_name":"HappyStoic/iris","owner":"HappyStoic","description":"Iris - P2P System for Confidential Sharing of Threat Intelligence and Collaborative Defense for Slips","archived":false,"fork":false,"pushed_at":"2024-08-28T05:58:14.000Z","size":1347,"stargazers_count":9,"open_issues_count":0,"forks_count":5,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-09-05T02:58:32.260Z","etag":null,"topics":["collaborative-defense","distributed","go","golang","idn","indicators-of-compromise","ipfs","ips","libp2p","p2p","p2p-network","peer-to-peer","slips","threat-intelligence"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/HappyStoic.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-12-22T09:36:49.000Z","updated_at":"2024-08-28T05:58:18.000Z","dependencies_parsed_at":"2024-08-28T07:05:01.607Z","dependency_job_id":null,"html_url":"https://github.com/HappyStoic/iris","commit_stats":null,"previous_names":["happystoic/iris"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/HappyStoic/iris","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HappyStoic%2Firis","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HappyStoic%2Firis/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HappyStoic%2Firis/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HappyStoic%2Firis/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/HappyStoic","download_url":"https://codeload.github.com/HappyStoic/iris/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HappyStoic%2Firis/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28655011,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-22T01:17:37.254Z","status":"online","status_checked_at":"2026-01-22T02:00:07.137Z","response_time":144,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["collaborative-defense","distributed","go","golang","idn","indicators-of-compromise","ipfs","ips","libp2p","p2p","p2p-network","peer-to-peer","slips","threat-intelligence"],"created_at":"2026-01-22T04:39:35.852Z","updated_at":"2026-01-22T04:39:38.013Z","avatar_url":"https://github.com/HappyStoic.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Iris: A Global P2P network for Sharing Threat Intelligence\n\nIris is a P2P system for collaborative defense proposed by Bc. Martin Řepa as a [diploma thesis work](https://www.stratosphereips.org/thesis-projects-list/2022/3/12/global-permissionless-p2p-system-for-sharing-distributed-threat-intelligence) (see  the thesis for theoretical details).\nThis repository hosts a reference implementation written in Golang using [LibP2P project](https://github.com/libp2p) along with integration of Iris\ninto [Slips IPS](https://github.com/draliii/StratosphereLinuxIPS) and [Fides Trust Model](https://github.com/lukasforst/fides). \n\nFor more details regarding architecture/implementation, we refer reader to [docs/architecture.md](docs/architecture.md) or the thesis itself.\n\n### Motivation \n\n_shortened thesis abstract:_\n\nDespite the severity and amount of daily cyberattacks, the best solutions our community has so far are\ncentralised, threat intelligence shared lists; or centralised, commercially-based defence products.\nNo system exists yet to automatically connect endpoints globally and share information about new attacks\nto improve their security. \n\nIris allows collaborative defence in cyberspace with emphasis on security and privacy concerns.\nIt is a pure and completely decentralised P2P network that allows peers to (i) share threat intelligence\nfiles, (ii) alert peers about detected attacks, and (iii) ask peers about their opinion on potential\nattacks. Iris addresses the problem of confidentiality of local threat intelligence data by\nintroducing the concept of _Organisations_. Organisations are cryptographically-verified and\ntrusted groups of peers within the P2P network. They allow Iris to send content only\nto pre-trusted groups of peers.\n\n## Dependencies\n\nTo run a standalone peer, you need:\n* a running redis instance\n* golang (\u003e1.17)\n\n## User Guide\n\n### OrgSig Tool\n\nFor pleasure manipulation with organisations, we present a tool called **orgsig**. Orgsig is a small program written in Golang\nthat can generate organisations or sign existing peers ID using already generated organisation.\n\n```bash\n\u003e make orgsig \ngo build cmd/orgsig.go\n\u003e  ./orgsig --help\nRunning v0.0.1 orgsig\n\nUsage of ./orgsig:\n  -load-key-path string\n    \tPath to a file with organisation private key. If not set, new private-key is generated.\n  -peer-id string\n    \tPublic ID of a peer to sign. Flag --sign-peer must be set for this option to be valid.\n  -save-key-path string\n    \tIf set, value will be used as a path to save organisation private-key.\n  -sign-peer\n    \tFlag to sign peer ID. Flag peer-id can be used to set peerID, otherwise, cli will ask. The signature will be printed to stdout.\n```\n\n\n### Running a Peer\n\nStarting a peer with reference configuration is as simple as running (assuming a Redis instance is running on local host):\n\n\u003e make run\n\n### Debugging, Running Multiple Peers\n\nTo run silmutaniously multiple peers, you can use already prepared docker-compose file with pre-configured 4 peers.\nThe network of 4 peers can be started with (note that you must have `docker` installed):\n\n```bash\n\u003e make network\n```\n\nThis command starts docker-compose with 4 peers in separate containers and one container with separate Redis instance. \nEvery peer connects to a different Redis channel and waits for messages from Fides (Fides mock has not yet been implemented). \nThe peers will connect to each other and thus form a small network. \nConfiguration files of every peer can be found in [dev/](dev) directory. \nTo interact with the peers, you must act as Fides Trust Model and send to the peers manually a message by publishing some \nmessages through Redis channels. Example PUBLISH commands can be found in [dev/redisobj.dev](dev/redisobj.dev).\n\n\n## Todo/Future Work:\n* Fides Trust Model Mock for better testing and debugging\n* Complete reference integration of Iris, Fides and Slips inside docker-compose\n* Signal handling for graceful shutdown\n* After a peer connects to the network, search immediately for members of trustworthy organisations. So far only `connector` does it.\n* Implement message (bytes?) rate-limiting per individual peers to mitigate flooding attacks (or adaptive gossips?)\n* Use more the Reporting Protocol to report misbehaving peers\n* Implement purging of keys after some time (configurable?) in peers' message cache\n* responseStorage goroutines should not wait for responses from peers that disconnected during the waiting. Otherwise,\nwhen that happens it's gonna unnecessarily wait until the timeout occurs\n* storageResponse goroutines should wait only for responses from peers where requests were successfully sent (err was nil)\n* implement purging of file metadata after files expire (viz currently not used field `ElapsedAt`)\n* Is reference basic manager really trimming peers based on their reliability? Need to be checked\n* **Plus Future Work mentioned in the thesis itself** \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhappystoic%2Firis","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhappystoic%2Firis","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhappystoic%2Firis/lists"}