Hi all,

Recently on `security-discuss@community` Christopher Schultz posted a
list[0] of security-related aspects that could be improved in Apache
projects.
After looking at the new Log4cxx release[1] and release review[2]
instructions, that I tried to automatise in PR #414[3], I am wondering
if we can come up with a release and release review procedure that is,
as much as possible, common to all projects.
The advantage of such a procedure would be to relieve PMC members from
remembering (or reading) the steps required to verify a release.

Some ideas for a brainstorming session:

### Staging a release

The Java projects have the most automatised release process:

1. It is started by a push to a `release/<version>` branch.
2. (Java specific) It publishes artifacts to Nexus.
3. It creates all the archives we need for `downloads.apache.org`,
computes their hashes and signatures.
4. It sends those archives to Subversion.

I think that this process could be generalized to all projects. We
only need to replace the Java-specific part with something specific to
each ecosystem. Do you agree?

The current implementation of point 3 is Maven specific: we use a
Groovy script started by a Maven plugin to package the files. Could we
perhaps replace this with something more universal? A shell script
should probably be enough. I have a prototype in [4], which only needs
some massaging to work on MacOS and Windows and some generalization.

### Reviewing a release

The release instructions for Java releases[5] start with some common
steps. We probably agree that the verification of each Logging
Services release should start with:

1. Downloading the artifacts in `downloads.apache.org`.
2. Verifying the hashes.
3. Verifying the signatures.

After these steps the current Java verification procedure directly
starts a build using the downloaded sources. IMHO there is a step
missing (which is crucial for Log4cxx and Log4NET): the integrity and
reproducibility of the source archive should be verified first! Since
the _de facto_ source archive is the Git repository, we need to:

4. Make a (shallow) clone of the appropriate Git commit.
5. Package the source archive. For this step we can reuse the same
script as in "Staging a release"
6. Verify the source archives using the hashes from Subversion.

Currently we justify the absence of these steps by the reproducibility
guarantees of our Java build. We should however consider that not all
PMC members run the reproducibility checks, which are basically only
guaranteed to work on Linux.

### Voting a release

A long dream of mine was to record the names of PMC members that voted
+1 on a release in a cryptographically verifiable way. We could adopt
an (optional) procedure, where PMC members:

1. Reproduce all the artifacts that will be published to `downloads.apache.org`.
2. Sign the local artifacts (not those downloaded from Subversion).
3. Append the signatures to those in Subversion.
4. If the signatures are valid (which not only guarantees that the
signer is who he claims to be, but also that the artifacts are
reproducible) push the commit to Subversion.

What do you think?

Piotr

[0] https://lists.apache.org/thread/4w27qvdxdc30mnt72sj98dhjmz2qq3z3
[1] https://github.com/apache/logging-log4cxx/blob/master/admin/releasing.md
[2] 
https://github.com/apache/logging-log4cxx/blob/master/admin/release-review-instructions.md
[3] https://github.com/apache/logging-log4cxx/pull/414
[4] 
https://github.com/apache/logging-log4cxx/blob/b1dfdf25289db7926db803eaaaf99607ee9e8829/package.sh
[5] 
https://logging.apache.org/logging-parent/release-review-instructions.html#verify

Reply via email to