Giter Club home page Giter Club logo

terraform-google-forseti's Introduction

Notice of Archiving

Dear Forseti users,

We are writing to inform you that we plan to archive the Forseti-Security repository.

Over the past few years, GCP Security has introduced a host of new features and capabilities that have addressed many security challenges targeted by Forseti. With low community engagement and limited improvements in the last two years, we have decided to place Forseti Security in archive. Note that other repos such as Forseti Real-Time-Enforcer and Resource-Policy-Evaliation-Library have also been automatically archived in February 2023 following no activities.

We plan to complete the archiving process by the end of June 2023.

What does this mean for you?

  • The Forseti-Security repository will be read-only, meaning that users will not be able to modify or contribute additional code.
  • You will however be able to fork or clone the repository and continue to use it however bearing ownership of your instance.
  • There will be no additional support from Google on Forseti. We are moving the existing support teams to new projects.

We thank you for your active engagement over the last few years.


Forseti Security

A community-driven collection of open source tools to improve the security of your Google Cloud Platform environments.

Get Started with Forseti Security.

Contributing

We are continually improving Forseti Security and invite you to submit feature requests and bug reports. If you would like to contribute to our development efforts, please review our contributing guidelines and submit a pull request.

More info on the branches.

forsetisecurity.org

If you would like to contribute to forsetisecurity.org, the website and its content are contained in the forsetisecurity.org-dev branch. Visit its README for instructions on how to make changes.

Governance

For information on how this project is managed and governed review our governance guidelines.

Community

Review our community page for ways to engage with the Forseti Community.

Support

Support for the Forseti Security product can be obtained through a few channels:

  • Join the Slack Channel and engage in discussions with other users and the Forseti community.
  • Ask a question about Forseti and get community support by posting to ([email protected]). Posts can receive responses from the community or from engineers on the Forseti team.
  • File a GitHub issue. Issues are typically reviewed and triaged within 24 - 48 hours.

Releases

Product releases will occur on a quarterly schedule. An out of band patch release may occur but only for a critical defect or security issue. The team will support patching critical defects or security issues in the current release and in the 2 previous quarterly releases only. If a defect is found in a release beyond current - 2 customers are expected to upgrade to a current supported version of the product.

Issue Triage

The triage process is a multi-step process that is collaboratively performed by the core project team and our issue bot. Triaging typically should occur within 1 - 2 business days, but may take longer, if the project team is not around. The purpose of triaging is to clearly understand the request and determine the next steps for what will happen with your issue. It's straightforward to understand whether or not your issue is triaged: if the issue contains the triaged :yes label this indiacts the issue has been reviewed and classified by the project team. In the case of a bug the a team member may request more details or information in order to better understand the problem, help determine prioritization or aid in reproducing the issue. We close issues for the following reasons:

Reason Label
The issue is obsolete or already fixed. N/A
We didn't get the information we needed within 7 days. issue-review: need-more-information
Given the information we have we can't reproduce the issue or do not feel the issue necessitates a fix. issue-review: closed won't fix
There has been activity on the issue for a significant period of time. stale

Assigning Milestones

In addition to milestones representing our iterations for our product releases we add additional labels that have special meaning:

  • Backlog Issue to be considered at some point in the future
  • 1 - Planning Issues being considered for one of the next 3 iterations. The issue is on the short list to be assigned to a concrete iteration.
  • 2 - Ready Issue assigned and scheduled for a specific target milestone release
  • 3 - Work in progress Issue is assigned to engineer and is actively working on the issue for targeted milestone release

Pull Requests

The team and community encourages pull requests to fix issues or improve the product. Pull requests are typically reviewed within 48 hours of submission. If pull requests become inactive they will be automatically closed, but can be quickly and easily re-opened. Please review the project’s contributing guidelines before submitting a pull request.

terraform-google-forseti's People

Contributors

aaron-lane avatar adrienthebo avatar angstwad avatar bcadiot avatar blueandgold avatar bmenasha avatar callppatel avatar choonchernlim avatar dekuhn avatar efouarge avatar gkowalski-google avatar glarizza avatar hshin-g avatar ingwarr avatar jdyke avatar jeffmccune avatar joecheuk avatar johnrevans6 avatar kevensen avatar marko7460 avatar morgante avatar ocervell avatar paulpalamarchuk avatar red-five avatar red2k18 avatar rosmo avatar rvandegrift avatar umairidris avatar upodroid avatar xingao267 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

terraform-google-forseti's Issues

Email notifications should be optional

Systematically adding the email_violation block to each notifier makes Forseti's forseti notifiers run fail if sendgrid_api_key is not set to a valid key.

Email notifications should stay optional and only enabled if sendgrid_api_key is not empty.

Client Firewall rule difference with original Forseti

Hi, I have found firewall difference between this terraform installation and original forseti source.
Original source have firewall rules which are named "forset-client-allow-ssh-external" and "forseti-client-deny-all". But this terraform plugin doesn't have.

https://github.com/terraform-google-modules/terraform-google-forseti/blob/master/modules/client/main.tf

https://github.com/GoogleCloudPlatform/forseti-security/blob/dev/install/gcp/installer/forseti_client_installer.py

It this intentional?

Changing rule config should not destroy/recreate server VM

depends_on on module.server_rules for the server VM means everytime a user changes a rule file (frequent when starting with Forseti), the whole VM gets re-created.

There is no need for this: ideally what should happen is that we run gsutil cp -R <BUCKET>/rules <FORSETI_HOME>/rules and then forseti server configuration reload. Simplier, we can just restart the server VM so that the startup script is re-executed when changing configs.

Remove Organization Admin as a requirement

Organization Administrator is a role that can potentially be very destructive.

We need to identify a subset of permissions that are really needed to create Forseti, and possibly help create a custom role that might have only those permissions (in case users are not comfortable with granting the wider role).

So far, we've identified that the Organization Administrator role can be replaced with a custom role with the following permissions:

  • resourcemanager.projects.getIamPolicy
  • resourcemanager.organizations.getIamPolicy
  • resourcemanager.organizations.setIamPolicy
  • resourcemanager.folders.getIamPolicy
  • resourcemanager.folders.setIamPolicy

org_id should be optional

When passing folder_id without org_id, we should be able to create a Forseti that:

  • Scans only the folder identified by folder_id (already done with root_resource_id)
  • Only grants permissions on the folder level

Currently, when passing both flags, all the organization-level roles are still granted (most are not needed since Forseti will be bound to a folder). This can be a blocker for companies where separation of business units at the top-level is important.

I'm wondering if Forseti can work without any organization permissions, but it should be (at minimum the service accounts should have limited org-level roles if folder_id is passed).

Deployment Manager dependency

The DM dependency looks weird to me knowing that DM is just another provisioning tool like Terraform.

Should we move provisioning of Forseti resources from Deployment Manager to native Terraform resources (e.g: CloudSQL instance, database, VMs and service accounts) instead of relying on the existing deployment manager scripts ?

Add composite root

Add in functionality of composite root found here: forseti-security/forseti-security#2596

Deployment Manager Forseti Installer will install Forseti using composite root with extra flag
--composite-root-resources="projects/project_id"

Need to manage new IAM roles and change the server configuration:
If a user has project owner role for project A, they should be able to install forseti directly on project A if the root resource is project A. The installer / terraform will go in and grant the server account all the project level viewer roles so that it can inventory the project, and not on an org level.

Remove `credentials_path` from examples and fixtures

Currently, the module requires passing a path to a Service Account key as an argument. This can make it harder to run as part of a pipeline where (a) an environment variable is used to track the file location (b) the application default credentials on a GCE VM should be used.

Make GCP CSCC configurable

Users should be able to enable and configure the GCS bucket for the GCP Cloud Security Command Center (CSCC) violations.

        enabled: ${enable_cscc_bucket}
        gcs_path: gs://${storage_bucket_name}/scanner_violations_cscc

Firewall rule should be more restrictive

The Forseti server TCP rule currently allows any VM in the network to make gRPC calls to the server (allowed range is the ip range for the subnetwork where Forseti is deployed): we can limit that firewall rule to have the forseti-client service account as the source; since only the client VM will make gRPC calls to the server VM.

Error when attempting installation

When attempting to configure Forseti as follows:

module "forseti" {
	source = "github.com/terraform-google-modules/terraform-google-forseti"
	download_forseti = "true"
	gcs_location = "us-central1"
	cloud_sql_region = "us-central1"
	sendgrid_api_key = "<REDACTED>"
	notification_recipient_email = "[email protected]"
	gsuite_admin_email = "[email protected]"
	project_id = "${module.forseti-project.project_id}"
	credentials_file_path = "../credentials/terraform.json"
}

I receive an error message as follows:

Error: Error applying plan:

1 error(s) occurred:

* module.forseti.null_resource.execute_forseti: Error running command 'cd forseti-security; python install/gcp_installer.py --no-cloudshell --service-account-key-file ../credentials/terraform.json --gsuite-superadmin-email [email protected] --sendgrid-api-key <REDACTED> --cloudsql-region us-central1 --notification-recipient-email [email protected] --gcs-location us-central1': exit status 1. Output: Read gcloud info: Success
VPC Host Project barefoot-forseti

################################################################################
#  Installing Forseti Server                                                   #
################################################################################


+-------------------------------------------------------------------------------
|  Pre-installation checks
+-------------------------------------------------------------------------------

Dry run: False
Advanced mode: False
Read gcloud info: Success
Current gcloud version: 216.0.0
Gcloud alpha components: True
You are: [email protected]
Project id: barefoot-forseti
Organization id: 571656855759
Service account activated
Billing: Enabled

+-------------------------------------------------------------------------------
|  Configuring GSuite Admin Information
+-------------------------------------------------------------------------------

To read G Suite Groups and Users data, please provide a G Suite super admin email address. This step is optional.
See https://forsetisecurity.org/docs/latest/setup/install.html to know what will not work without G Suite integration.

Email: Traceback (most recent call last):
  File "install/gcp_installer.py", line 23, in <module>
    gcp_installer.run()
  File "/Users/jberlinsky/src/clients/BarefootCoders/google-infrastructure/forseti-security/install/gcp/gcp_installer.py", line 125, in run
    instructions = forseti_server.run_setup(final_setup=False)
  File "/Users/jberlinsky/src/clients/BarefootCoders/google-infrastructure/forseti-security/install/gcp/installer/forseti_installer.py", line 125, in run_setup
    self.preflight_checks()
  File "/Users/jberlinsky/src/clients/BarefootCoders/google-infrastructure/forseti-security/install/gcp/installer/forseti_server_installer.py", line 60, in preflight_checks
    self.get_email_settings()
  File "/Users/jberlinsky/src/clients/BarefootCoders/google-infrastructure/forseti-security/install/gcp/installer/forseti_server_installer.py", line 360, in get_email_settings
    constants.QUESTION_GSUITE_SUPERADMIN_EMAIL).strip()
EOFError: EOF when reading a line


Terraform does not automatically rollback in the face of errors.
Instead, your Terraform state file has been partially updated with
any resources that successfully completed. Please address the error
above and apply again to incrementally change your infrastructure.

At a very quick glance, it looks like this line is trying to collect data from STDIN, which null_resource.execute_forseti is passing as a CLI flag. It looks like this changed on or about 8/23/2018, in this commit.

Temporary Resolution: If I go into the cloned forseti-security/ repository and check out the prior commit, forseti-security/forseti-security@87e42da, I'm able to proceed with deploying Forseti.

Suggested Fix: This seems to be an issue with Forseti itself, but it also seems unnecessarily restrictive to limit Forseti checkouts to just branch names. Perhaps an appropriate first step here would be allowing all git refs (including SHAs and named branches) to be used in the forseti_repo_branch variable. From there, some GH Issues should probably be filed with the Forseti project.

Removing binding at service account creation

The setup helper (/helpers/setup.sh), in line 86 has a remove iam policy binding for a newly created service account, which didn't have that policy in the first place, This causes the script to complain that the service account doesn't have the relevant permissions. I believe it should be replaced by an add like all the other bindings in the file:

86 gcloud projects remove-iam-policy-binding ${PROJECT_ID} \
87    --member="serviceAccount:${SERVICE_ACCOUNT_ID}" \
89    --role="roles/iam.serviceAccountUser" \
90    --user-output-enabled false

Make forseti server/client private

Some deployments might require forseti server access to be only through private IP. It would be good if the server can be created without access_config parameter for these cases. This can be controlled via private_server or private_client variable

Config Validator Port Firewall Rule

Currently we have only this firewall rule which opens the port of 50051, but Config Validator server use the port 50052. Please add firewall rule to open 50052 as well.

resource "google_compute_firewall" "forseti-server-allow-grpc" {
name = "forseti-server-allow-grpc-${local.random_hash}"
project = "${local.network_project}"
network = "${var.network}"
target_service_accounts = ["${google_service_account.forseti_server.email}"]
source_ranges = "${var.server_grpc_allow_ranges}"
priority = "100"

allow {
protocol = "tcp"
ports = ["50051"]
}

depends_on = ["null_resource.services-dependency"]
}

Input Parameter cloudsql_db_name not respected in cloudsql

Hi guys,

I used the input variable
cloudsql_db_name = "my-custom-db-name"
to change the db name that gets used. This gets configured correctly in the settings and startup script for the server, especially here:

But it is not respected for the definition of the cloudsql db here:

name = "forseti_security"

This led to an non working setup after running the module. I would suggest to fix that, if you want I can do a PR.

Regards,
Simon

Custom Rules Workflow

How should I handle creation of custom rules? For example, the Service Account Key rule currently is set to 100 days in the rules module, but what if I want that to be 90?

Should I send a pull request to update this module with another variable or is there some way I can add custom rules? Fork this repo and start my own custom module?

My ideal process would be that when a config rule changes in source, it would start a chain of events which would update that rule in the bucket and have forseti re-run the scanners.

Ignore changes to cloudsql disk size

The cloudsql instance which is created in module.forseti.module.server.google_sql_database_instance.master has disk_autoresize: "true". This is all well and good. However this means that future terraform applys attempt to delete and recreate the database in order to return the disk size to the original 25GB. This is both i) quite destructive and ii) doomed to failure because of GCP's soft deletion rules.

Would it be possible for a suitable ignore_changes entry to be added to this resource's lifecycle?

Terraform destroy fails on google_sql_user

I ran into an error while running tf destroy on a simple Forseti deployment:

Error: Error applying plan:

1 error(s) occurred:

* module.forseti-install-simple.module.server.google_sql_user.root (destroy): 1 error(s) occurred:

* google_sql_user.root: Error, failed to deleteuser root in instance forseti-server-db-ce89442d: googleapi: Error 400: Missing parameter: host., required

Another tf destroy afterwards also gave me some weird errors:

11 error(s) occurred:

* module.forseti-install-simple.module.server.output.forseti-server-storage-bucket: variable "server_config" is nil, but no error was reported
* module.forseti-install-simple.module.client.output.forseti-client-vm-public-ip: Resource 'google_compute_instance.forseti-client' does not have attribute 'network_interface.0
.access_config.0.nat_ip' for variable 'google_compute_instance.forseti-client.network_interface.0.access_config.0.nat_ip'
* module.forseti-install-simple.local.random_hash: local.random_hash: variable "random_hash_suffix" is nil, but no error was reported
* module.forseti-install-simple.module.server.output.forseti-server-vm-ip: variable "forseti-server" is nil, but no error was reported
* module.forseti-install-simple.module.client.output.forseti-client-storage-bucket: Resource 'google_storage_bucket.client_config' does not have attribute 'id' for variable 'go
ogle_storage_bucket.client_config.id'
* module.forseti-install-simple.module.server.output.forseti-server-service-account: variable "forseti_server" is nil, but no error was reported

* module.forseti-install-simple.module.client.output.forseti-client-vm-name: Resource 'google_compute_instance.forseti-client' does not have attribute 'name' for variable 'goog
le_compute_instance.forseti-client.name'
* module.forseti-install-simple.module.server.output.forseti-server-vm-name: variable "forseti-server" is nil, but no error was reported
* module.forseti-install-simple.module.server.output.forseti-server-vm-public-ip: variable "forseti-server" is nil, but no error was reported
* module.forseti-install-simple.module.client.output.forseti-client-service-account: Resource 'google_service_account.forseti_client' does not have attribute 'email' for variab
le 'google_service_account.forseti_client.email'
* module.forseti-install-simple.module.client.output.forseti-client-vm-ip: Resource 'google_compute_instance.forseti-client' does not have attribute 'network_interface.0.networ
k_ip' for variable 'google_compute_instance.forseti-client.network_interface.0.network_ip'

accScript.sh SED does not work with Mac

The accScript.sh uses the GNU version of sed. If running this on a Mac, the apply will fail due to the default sed is a different (BSD) flavor.

A quick workaround is to install gsed using 'brew install gnu-sed' and updating the accScript to use the gsed command instead of sed

The README.md should be updated to reflect this

Startup scripts failed to get executed on a fresh deployment

Startup scripts failed to get executed on a fresh deployment

Created a default terraform plan and all went well, 71 resources created, and no errors but when I login to the server/client, there's no forseti service nor forseti_security directory under /home/ubuntu or anywhere. Is this related to this bug? https://stackoverflow.com/questions/50422205/gce-startup-script-fails-to-run-on-ubuntu-18-04

module "forseti" {
  source  = "terraform-google-modules/forseti/google"
  version = "1.0.0"

  gsuite_admin_email = "[email protected]"
  domain             = "mydomain.com"
  project_id         = "myproject"
  org_id             = "7777777777777"
}

terraform output

...
module.forseti.client.google_compute_instance.forseti-client: Still creating... (10s elapsed)
module.forseti.client.google_compute_instance.forseti-client: Still creating... (20s elapsed)
module.forseti.module.client.google_compute_instance.forseti-client: Creation complete after 22s (ID: forseti-client-vm-xxxxx)

Apply complete! Resources: 71 added, 0 changed, 0 destroyed.

Add test-kitchen coverage for Forseti client

We should add test coverage on the forseti client VM to verify that Forseti can produce scans:

  • forseti config show works and points to the correct server address and port
  • forseti inventory create can generate an inventory
  • forseti scanner run can run successfully

This issue applies to #14.

accScript.sh in the wrong location

The main.tf file is expecting the accScript.sh file in the scripts folder:

37 launch_first = "sh scripts/accScript.sh ${var.gsuite_admin_email}; "

And at the moment, the accScript.sh file is in the root folder:

drwxr-xr-x 3 user user  4096 Nov  6 11:46 examples
drwxr-xr-x 2 user user  4096 Nov  7 10:06 helpers
-rw-r--r-- 1 user user 11357 Nov  6 11:46 LICENSE
-rw-r--r-- 1 user user  3975 Nov  6 11:46 main.tf
-rw-r--r-- 1 user user  2011 Nov  6 11:46 Makefile
-rw-r--r-- 1 user user   781 Nov  6 11:46 outputs.tf
-rw-r--r-- 1 user user  6704 Nov  6 11:46 README.md
drwxr-xr-x 2 user user  4096 Nov  6 11:46 scripts
drwxr-xr-x 3 user user  4096 Nov  6 11:46 test
-rw-r--r-- 1 user user  1831 Nov  6 11:46 variables.tf```

"suffix" is not a valid output for module "forseti-install"

The output variable for the random-hash suffix does not appear to resolve correctly.

I see the suffix as an output in outputs.tf:

output "suffix" {
  description = "The random suffix appended to Forseti resources"
  value       = "${local.random_hash}"
}

However, when I try to reference it from my forseti-install module via ${module.forseti-install.suffix}I get:

"suffix" is not a valid output for module "forseti-install"

CSCC API + Role Enablement

If cscc_violations_enabled is set to "true", then maybe we should:

  • Enable the Cloud Command Security Center API (securitycenter.googleapis.com) in the Forseti project
  • Grant the roles/securityCenter.editor role to the Forseti server service account

Those are two manual steps that are still required when setting up the integration.

Feature Request: Forseti Deployment to GKE

There is a Proof of Concept hosting Forseti on GKE (targeted for v2.13 release)

Ref. forseti-security/forseti-security#2162 (comment)

Anyone with terraform experience willing to PoC a deployment to GKE?

It would be a matter of replacing the client and server vm deployment sections with the GKE deployment
and possibly tweaking firewall rules to ensure its secure.

A rough draft of a bash script deployment as example:
https://github.com/GoogleCloudPlatform/forseti-security/blob/docker-poc/install/scripts/k8s_setup_forseti.sh

Update CI pipeline to use ephemeral projects

Related to #165 and #148.

The current CI pipeline experiences consistent failures unrelated to changes being tested. Stale resources leftover in the test projects are a large part of this problem.

The CI pipeline should be updated to create a new project for each build. This will involve migrating the existing test fixture code from https://github.com/GoogleCloudPlatform/cloud-foundation-toolkit to this repository. An added bonus of this change will be providing a mechanism for creating consistent test environments for developers.

Remove extraneous VM labels

The client and server VM have the goog-dm labels, which appear to be an artifact from the Deployment Manager based approach used in the v1 release of this module. We should remove them.

See #14 (comment)

Make Forseti user directory and path configurable

We need to:

  • make the USER=ubuntu configurable in startup scripts.
  • make Forseti's path configurable (atm. hardcoded to /home/ubuntu/forseti-security).
  • See #14 comment

Users should be able to choose their own user on their VM, and change the path where Forseti should be installed.

Update Module to Support GKE

In order to support deploying forseti-security on GKE, this module should deploy a GKE cluster. It should have the following features.

  1. Deploy forseti-security via Helm
  2. If the user already has a GKE cluster they want to use, don't deploy a new GKE cluster, and don't deploy a server VM
  3. If the user doesn't have a GKE cluster, deploy a GKE cluster with hardening best practices, and don't deploy a server VM
  4. If the user doesn't want to deploy on GKE, deploy the server VM
  • Terra-form sub-module - For Helm to function on GKE (BETA)
  • Terra-form changes for optional deployment of Server VM (GA)
  • Terra-form changes for optional deployment of Client VM (GA)

Terraform 0.12.x

It looks like the new version of Terraform made some breaking changes to the syntax. Indeed when I tried to use this module with the new version, I quickly ran into errors I wasn't sure how to resolve.

I ran the included migration tool (I committed the results here), and am still receiving errors:

Error: Incorrect condition type

  on terraform-google-forseti/modules/server/main.tf line 252, in data "template_file" "forseti_server_config":
 252:     GROUPS_SETTINGS_DISABLE_POLLING                     = var.groups_settings_disable_polling ? "true" : "false"
    |----------------
    | var.groups_settings_disable_polling is "False"

The condition expression must be of type bool.

Are there plans to add support for the new version?

Add CSCC findings IAM role

If CSCC is configured, then the Forseti server service account needs the org role binding roles/securitycenter.findingsEditor.

Currently, users will have to create this IAM binding outside of the module with:

resource "google_organization_iam_member" "cscc" {
  org_id = "${var.org_id}"
  role   = "roles/securitycenter.findingsEditor"
  member = "serviceAccount:${module.forseti.forseti-server-service-account}"
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.