SSL Ciphers on ELB
Thursday, September 22, 2011 at 9:25AM
For some of the apps 'in our portfolio' we run PCI compliance scans. I won't name names, but we use McAfee for this particular one. These scans are great, but they have uncanny ability to always find something.
This time they did find something we are not particularly happy with. The problem they reported was that we had weak SSL ciphers enabled on our ELBs.
Of we course we are not alone with this problem, and AWS recently added support for this particular problem. They were happy to announce the support of SSL ciphers a few weeks ago.
But, as is often the case with AWS, how to actually make this work is somewhere inbetween Developer Guid, API Specification, Jeff's wise words and people like us struggling and helping each other on the forum.
We are currently not in production yet, but we are testing if this is the way to go. If you have some sort of shell with the cmdline tools set up, you can follow along with this on your own ELBs.
Be default we all of the following enabled
name=Protocol-SSLv2,value=falsename=Protocol-TLSv1,value=truename=Protocol-SSLv3,value=truename=DHE-RSA-AES256-SHA,value=truename=DHE-DSS-AES256-SHA,value=truename=DHE-RSA-CAMELLIA256-SHA,value=truename=DHE-DSS-CAMELLIA256-SHA,value=truename=ADH-AES256-SHA,value=falsename=ADH-CAMELLIA256-SHA,value=falsename=AES256-SHA,value=truename=CAMELLIA256-SHA,value=truename=PSK-AES256-CBC-SHA,value=truename=EDH-RSA-DES-CBC3-SHA,value=truename=EDH-DSS-DES-CBC3-SHA,value=truename=ADH-DES-CBC3-SHA,value=falsename=DES-CBC3-SHA,value=truename=DES-CBC3-MD5,value=falsename=PSK-3DES-EDE-CBC-SHA,value=truename=KRB5-DES-CBC3-SHA,value=truename=KRB5-DES-CBC3-MD5,value=truename=DHE-RSA-AES128-SHA,value=truename=DHE-DSS-AES128-SHA,value=truename=DHE-RSA-SEED-SHA,value=truename=DHE-DSS-SEED-SHA,value=truename=DHE-RSA-CAMELLIA128-SHA,value=truename=DHE-DSS-CAMELLIA128-SHA,value=truename=ADH-AES128-SHA,value=falsename=ADH-SEED-SHA,value=falsename=ADH-CAMELLIA128-SHA,value=falsename=AES128-SHA,value=truename=SEED-SHA,value=truename=CAMELLIA128-SHA,value=truename=RC2-CBC-MD5,value=falsename=PSK-AES128-CBC-SHA,value=truename=ADH-RC4-MD5,value=falsename=IDEA-CBC-SHA,value=truename=RC4-SHA,value=truename=RC4-MD5,value=truename=PSK-RC4-SHA,value=truename=KRB5-RC4-SHA,value=truename=KRB5-RC4-MD5,value=truename=EDH-RSA-DES-CBC-SHA,value=truename=EDH-DSS-DES-CBC-SHA,value=truename=ADH-DES-CBC-SHA,value=falsename=DES-CBC-SHA,value=truename=DES-CBC-MD5,value=falsename=KRB5-DES-CBC-SHA,value=truename=KRB5-DES-CBC-MD5,value=truename=EXP-EDH-RSA-DES-CBC-SHA,value=truename=EXP-EDH-DSS-DES-CBC-SHA,value=truename=EXP-ADH-DES-CBC-SHA,value=falsename=EXP-DES-CBC-SHA,value=truename=EXP-RC2-CBC-MD5,value=truename=EXP-KRB5-RC2-CBC-SHA,value=truename=EXP-KRB5-DES-CBC-SHA,value=truename=EXP-KRB5-RC2-CBC-MD5,value=truename=EXP-KRB5-DES-CBC-MD5,value=truename=EXP-ADH-RC4-MD5,value=falsename=EXP-RC4-MD5,value=truename=EXP-KRB5-RC4-SHA,value=truename=EXP-KRB5-RC4-MD5,value=true
We don't want that, we want to be more restrictive lik ELBSample-ELBDefaultNegotiationPolicy, one of the defaults AWS offers when creating an ELB. The totally shitty thing is that these policies are ELB specific, and not account wide.
name=Protocol-SSLv2,value=falsename=EDH-DSS-DES-CBC3-SHA,value=falsename=DHE-RSA-CAMELLIA128-SHA,value=falsename=DES-CBC-MD5,value=falsename=KRB5-RC4-SHA,value=falsename=ADH-CAMELLIA128-SHA,value=falsename=EXP-KRB5-RC4-MD5,value=falsename=ADH-RC4-MD5,value=falsename=PSK-RC4-SHA,value=falsename=PSK-AES128-CBC-SHA,value=falsename=EXP-EDH-RSA-DES-CBC-SHA,value=falsename=CAMELLIA128-SHA,value=falsename=DHE-DSS-AES128-SHA,value=falsename=EDH-RSA-DES-CBC-SHA,value=falsename=DHE-RSA-SEED-SHA,value=falsename=KRB5-DES-CBC-MD5,value=falsename=DHE-RSA-CAMELLIA256-SHA,value=falsename=ADH-DES-CBC3-SHA,value=falsename=DES-CBC3-MD5,value=falsename=EXP-KRB5-RC2-CBC-MD5,value=falsename=EDH-DSS-DES-CBC-SHA,value=falsename=KRB5-DES-CBC-SHA,value=falsename=PSK-AES256-CBC-SHA,value=falsename=ADH-AES256-SHA,value=falsename=KRB5-DES-CBC3-SHA,value=falsename=AES128-SHA,value=truename=DHE-DSS-SEED-SHA,value=falsename=ADH-CAMELLIA256-SHA,value=falsename=EXP-KRB5-RC4-SHA,value=falsename=EDH-RSA-DES-CBC3-SHA,value=falsename=EXP-KRB5-DES-CBC-MD5,value=falsename=Protocol-TLSv1,value=truename=PSK-3DES-EDE-CBC-SHA,value=falsename=SEED-SHA,value=falsename=DHE-DSS-CAMELLIA256-SHA,value=falsename=IDEA-CBC-SHA,value=falsename=RC2-CBC-MD5,value=falsename=KRB5-RC4-MD5,value=falsename=ADH-AES128-SHA,value=falsename=RC4-SHA,value=truename=AES256-SHA,value=truename=Protocol-SSLv3,value=truename=EXP-DES-CBC-SHA,value=falsename=DES-CBC3-SHA,value=truename=DHE-RSA-AES128-SHA,value=falsename=EXP-EDH-DSS-DES-CBC-SHA,value=falsename=EXP-KRB5-RC2-CBC-SHA,value=falsename=DHE-RSA-AES256-SHA,value=falsename=KRB5-DES-CBC3-MD5,value=falsename=RC4-MD5,value=truename=EXP-RC2-CBC-MD5,value=falsename=DES-CBC-SHA,value=falsename=EXP-ADH-RC4-MD5,value=falsename=EXP-RC4-MD5,value=falsename=ADH-DES-CBC-SHA,value=falsename=CAMELLIA256-SHA,value=falsename=DHE-DSS-CAMELLIA128-SHA,value=falsename=EXP-KRB5-DES-CBC-SHA,value=falsename=EXP-ADH-DES-CBC-SHA,value=falsename=DHE-DSS-AES256-SHA,value=falsename=ADH-SEED-SHA,value=false
We saved this file in strict-ciphers.txt and to create our policy for the specific ELB
$ awk 'BEGIN{ cmd = "elb-create-lb-policy staging-9apps-net --policy-name Strict-ELBNegotiationPolicy --policy-type SSLNegotiationPolicyType" }{ cmd = cmd " --attribute \x22"$1"\x22" }END{system( cmd)}' strict-ciphers.txt$ awk 'BEGIN{ cmd = "elb-create-lb-policy staging-9apps-org --policy-name Strict-ELBNegotiationPolicy --policy-type SSLNegotiationPolicyType" }{ cmd = cmd " --attribute \x22"$1"\x22" }END{system( cmd)}' strict-ciphers.txt
Enabling it for the staging-9apps-net and staging-9apps-org ELBs
$ elb-set-lb-policies-of-listener staging-9apps-net \ --lb-port 443 \ --policy-names Strict-ELBNegotiationPolicy$ elb-set-lb-policies-of-listener staging-9apps-org \ --lb-port 443 \ --policy-names Strict-ELBNegotiationPolicy
We hope this helps everyone along a bit, with getting the ciphers they want.








Reader Comments (2)
Hi, can you post what the resultant set of Ciphers that are left set to true are? Thanks.
name=AES128-SHA,value=true
name=Protocol-TLSv1,value=true
name=RC4-SHA,value=true
name=AES256-SHA,value=true
name=Protocol-SSLv3,value=true
name=DES-CBC3-SHA,value=true
name=RC4-MD5,value=true