DEPRECATED - Migrated to https://github.com/mozilla/fxa
fxa
Перейти к файлу
Phil Booth b39f993bb6 (iprecord): ignore prior rate-limiting for account access actions
Requests to /check with allow-listed email addresses cause the IP record
to to be marked as rate-limited, even though those requests aren't
actually blocked. Any subsequent requests to /checkIpOnly will fetch the
rate-limited IP record from memcached and block the request incorrectly.
This is a problem for the content server functional tests.

The change here ignores any previous rate-limiting for account access
actions, effectively putting them into a separate rate-limiting bucket.

https://github.com/mozilla/fxa-customs-server/pull/207
r=rfk
2017-06-28 05:21:01 -07:00
bin fix(shutdown): Fix deferred call of process.exit(code). (#183); r=jrgm 2017-02-27 17:06:13 +11:00
config fix(config): restore top-level "config" dir for $(NODE_ENV).json files. 2016-02-19 11:05:45 +11:00
docs fix(docs): Add notes for sms (#184), r=@shane-tomlinson 2017-03-09 16:31:26 -05:00
grunttasks refactor(lib): Put all the code inside a "lib" subdirectory. 2016-02-17 15:59:00 +11:00
lib (iprecord): ignore prior rate-limiting for account access actions 2017-06-28 05:21:01 -07:00
scripts feat(docker): add Docker support (#176) r=vladikoff,jbuck 2017-03-05 13:02:18 -05:00
test (iprecord): ignore prior rate-limiting for account access actions 2017-06-28 05:21:01 -07:00
.awsbox.json Actually address the typo that Andy found 2014-06-27 15:05:27 +12:00
.eslintrc chore(build): Replace JSHint with ESLint 2015-06-29 17:20:42 -07:00
.gitignore chore(lint): Fix up some linty issues noticed in PR review. 2016-10-17 12:38:58 +11:00
.travis.yml feat(ipreputation): Use IP reputation service from /check (#152), r=@vbudhram 2017-01-17 14:34:13 -05:00
CHANGELOG Release v1.88.0 2017-05-31 13:17:42 +10:00
CONTRIBUTING.md fix(docs): Add note about commit messages (#155); r=rfk 2017-01-11 06:47:29 +11:00
Dockerfile-build chore(docker): Use official node image & update to Node.js v4.8.2 (#196) r=vladikoff 2017-04-18 18:35:42 -04:00
Dockerfile-test feat(docker): add Docker support (#176) r=vladikoff,jbuck 2017-03-05 13:02:18 -05:00
Gruntfile.js chore(build): Replace JSHint with ESLint 2015-06-29 17:20:42 -07:00
LICENSE Add a copy of the MPL and put tests in Public Domain 2014-05-06 16:28:34 +12:00
README.md fix(sms): Add ability to rate-limit sms by email (#198), r=@rfk 2017-04-21 09:26:43 -04:00
circle.yml feat(docker): add custom feature branch (#202) r=jrgm 2017-05-16 14:44:51 -07:00
npm-shrinkwrap.json Release v1.88.0 2017-05-31 13:17:42 +10:00
package.json Release v1.88.0 2017-05-31 13:17:42 +10:00

README.md

Firefox Accounts Customs Server

Build Status CircleCI

This project is used by the Firefox Accounts Auth Server to detect and deter fraud and abuse.

Development

Clone the git repository and install dependencies:

git clone git://github.com/mozilla/fxa-customs-server.git
cd fxa-customs-server
npm install

To start the server, run:

npm start

It will listen on http://127.0.0.1:7000 by default.

Docker Based Development

To run the customs server via Docker:

$ docker-compose up mozilla/fxa_customs_server

Testing

Run tests with:

npm test

On Mac OS X, memcached must be manually started for the tests to run.

memcached &
npm test

To run tests via Docker:

docker-compose run mozilla/fxa_customs_server npm test

Code

Here are the main components of this project:

  • ./bin/customs_server.js: process listening on the network and responding to HTTP API calls
  • ./lib/bans/: code implementing temporary bans of specific email or IP addresses and listening on the SQS API for requests
  • ./lib/config/config.js: where all of the configuration options are defined
  • ./lib/email_record.js, ./lib/ip_email_record.js and ./lib/ip_record.js: code implementing the various blocking and rate-limiting policies
  • ./scripts: helper scripts only used for development/testing
  • ./test/local: unit tests
  • ./test/remote: tests exercising the HTTP API

API

See our detailed API spec.

Policies

There are two types of policies:

  • rate-limiting: slows down attackers by temporarily blocking requests for 15 minutes (see config.limits.rateLimitIntervalSeconds)
  • block / ban: stops attacks by temporarily blocking requests for 24 hours (see config.limits.blockIntervalSeconds)

We currently have the following policies in place:

  • rate-limiting when too many emails (config.limits.maxEmails defaults to 3) have been sent to the same email address in a given time period (config.limits.rateLimitIntervalSeconds defaults to 15 minutes)
  • rate-limiting when too many requests to look up account status by email address (config.limits.maxAccountStatusCheck) have been sent from the same ip address during
  • rate-limiting when too many sms (config.limits.smsRateLimit.maxSms) have been sent from the same ip address during period (config.limits.smsRateLimit.limitIntervalSeconds defaults to 60 minutes)
  • rate-limiting when too many sms (config.limits.smsRateLimit.maxSms) have been sent from the same email address during period (config.limits.smsRateLimit.limitIntervalSeconds defaults to 60 minutes)
  • rate-limiting when too many sms (config.limits.smsRateLimit.maxSms) have been sent to the same phone number during period (config.limits.smsRateLimit.limitIntervalSeconds defaults to 60 minutes)
  • rate-limiting when too many failed login attempts (config.limits.maxBadLogins defaults to 2) have occurred for a given account and IP address, in a given time period (config.limits.rateLimitIntervalSeconds defaults to 15 minutes)
  • manual blocking of an account (see /blockEmail API call)
  • manual blocking of an IP address (see /blockIp API call)

The data that these policies are based on is stored in a memcache instance (keyed by email, ip or ip + email depending on the policy) and the code that implements them is split across these three files:

  • email_record.js handles blocking and rate-limiting based only on the email address
  • ip_email_record.js handles rate-limiting based on both the email and IP address of the request
  • ip_record.js handles blocking based only on the IP address

The rate-limiting and blocking policies are conveyed to the auth server via the block property in the response to /check.